本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1jG-rGG4QMuZu0t0kEEl7SA?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Data_Visualization
函数语法:
plt.bar(x, height, width=0.8, bottom=None, *,
align='center', data=None, **kwargs)
其中:
-
必需参数:
-
x:条形在x轴上的位置坐标,即类别数据。可以是标量或序列,确定每个条形的中心或边缘位置(取决于align参数)。若传入数值型x,默认需用plt.xticks(x, labels)手动设置类别标签;若传入字符串x,Matplotlib 会自动将其作为 x 轴标签。 -
height:条形的高度(y轴方向的数值)。与x参数长度相同的序列。
-
可选参数:
-
width:条形的宽度(比例值)。可以是单个值(所有条形相同宽度)或与x等长的序列(每个条形独立宽度)。
-
bottom:条形的底部位置(y轴起点)。选项包括None(默认,底部从0开始)、标量(所有条形从同一高度开始)、序列(每个条形从指定高度开始,用于堆叠条形图)
-
align:控制x参数定义的 “锚点位置” 与长条的相对关系,进而影响 x 轴标签的显示位置。选项包括‘center’(x是长条的 “水平中心” 位置,标签居中对齐长条) 或 ‘edge’(x是长条的 “左侧边缘” 位置,标签对齐长条左侧边缘)。 -
data:包含x和height数据的对象。可索引对象(如字典、DataFrame)。
-
其他常用kwargs参数:
-
color: 条形颜色(可接受颜色名称、十六进制值或RGB元组)。
-
edgecolor: 条形边缘颜色。
-
yerr, xerr: 添加误差线,表示数据的不确定性或变异程度。
-
ecolor: 误差线(error bars)的颜色,在条形图中可以配合yerr或xerr参数使用,用来显示数据的不确定性或误差范围(如测量误差、统计标准差等)。
-
linewidth: 条形边缘线宽。
-
alpha: 透明度(0-1)。
-
label: 用于图例的标签。
-
tick_label: 刻度标签,不传则自动取 x 。
-
hatch: 填充图案(‘/’, ”, ‘|’, ‘-‘, ‘+’, ‘x’, ‘o’, ‘O’, ‘.’, ‘*’)。
-
linestyle: 边缘线样式。
-
capstyle: 线帽样式。
-
capsize: 线帽的长度(单位:磅)。
通过调整这些参数,可以灵活控制长条图的视觉效果。
# 数据准备
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 12, 37]
# 自定义颜色:为每个条形设置不同的填充色
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#F9C80E', '#FF8C42']
# 创建图形
plt.figure(figsize=(10, 6))
# 绘制条形图
bars =plt.bar(
categories, # x轴数据(类别)
values, # y轴数据(数值)
align='edge', # 条形边缘与刻度线对齐
color=colors, # 条形填充色,使用自定义颜色列表
edgecolor='black', # 条形边框颜色
linewidth=1.2, # 边框线宽
linestyle='--', # 边框线型(虚线)
width=[0.6, 0.7, 0.5, 0.8, 0.6], # 每个条形的宽度(可不同)
alpha=0.8, # 透明度(0-1之间)
tick_label=['类别一', '类别二', '类别三', '类别四', '类别五'], # x轴刻度标签
hatch='*', # 条形内部填充图案(星号)
label='图例' # 用于图例显示的标签
)
plt.title('基础条形图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend(fontsize=15) # 图例
plt.grid(axis='y', alpha=0.4, linestyle='--') # 添加网格线
# 显示图形
plt.show()
可视化结果如下图所示:

使用示例:
-
示例 1:顶端标注数值
在条形图顶端明确标注数值,能避免视觉误差对数据解读的干扰。尤其当柱体长度接近或比例尺较大时,标注具体数值可提升数据精确度。
具体操作是,通过 BarContainer 对象遍历所有条形,结合 get_height () 精准获取数据,然后使用 text () 方法在柱顶添加数值标签。其中:
-
在 matplotlib 中,bar () 函数返回的 BarContainer 对象,包含所有创建的条形对象(Rectangle patches),相当于为每根柱子建立 “索引”,便于后续精准操作。
-
bar.get_height () 方法是获取条形高度(即对应数据值)的核心工具,其本质是读取 Rectangle patches 的高度属性。
# 数据准备
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 12, 37]
# 创建图形
plt.figure(figsize=(10, 6))
# 绘制条形图
bars =plt.bar(categories, values,)
# 在条形上添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 0.5,
f'{height}', ha='center', va='bottom')
plt.title('条形图顶端标注数值示例')
plt.xlabel('类别')
plt.ylabel('数值')
# 显示图形
plt.show()
可视化结果如下图所示:

-
示例 2:多数据长条图:
分组条形图适用于在同一图表内比较多个类别下的不同组别数据。通过并列排列同类别不同组的条形,便于组内和组间比较。建议采用区分度高的填充样式或颜色,并在图例中明确说明各组含义。核心思路是通过调整x轴位置实现分组排列:
-
使用np.arange()生成等间距位置;
-
通过调整x坐标实现分组效果(-width/2和+width/2);
-
添加图例(legend())区分不同系列。
# 准备多组数据
values1 = [23, 45, 56, 12, 37]
values2 = [34, 30, 45, 28, 42]
values3 = [28, 40, 35, 20, 38]
x = np.arange(len(categories)) # 类别位置
width = 0.25 # 条形宽度
plt.figure(figsize=(12, 7))
# 绘制分组条形图
bars1 = plt.bar(x - width, values1, width, label='数据集1', alpha=0.8)
bars2 = plt.bar(x, values2, width, label='数据集2', alpha=0.8)
bars3 = plt.bar(x + width, values3, width, label='数据集3', alpha=0.8)
# 6. 添加数值标注(分别为两组长条添加)
for bars in [bars1, bars2, bars3]:
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height + 0.5,
f'{height}元', ha='center', va='bottom', fontsize=9)
plt.title('分组条形图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.xticks(x, categories) # 设置x轴刻度标签
plt.legend() # 显示图例
plt.show()

-
示例 3:堆叠图
堆叠条形图用于展示每个类别内部子部分的构成及其总体累积情况。该图可直观呈现部分与整体之间的关系,但需注意子部分的排序一致性。为增强可读性,建议在图中标注组成部分的数值或百分比。核心是通过bottom参数指定下一层长条的顶部位置。
# 准备多组数据
values1 = [23, 45, 56, 12, 37]
values2 = [34, 30, 45, 28, 42]
values3 = [28, 40, 35, 20, 38]
categories = ['A', 'B', 'C', 'D', 'E']
plt.figure(figsize=(10, 6))
# 绘制堆叠条形图
bars1 =plt.bar(categories, values1, label='部分1', alpha=0.8)
bars2 =plt.bar(categories, values2, bottom=values1, label='部分2', alpha=0.8)
bars3 =plt.bar(categories, values3, bottom=np.array(values1) + np.array(values2),
label='部分3', alpha=0.8)
# 标注第一部分数值
for bar in bars1:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height/2,
f'{height}', ha='center', va='center', fontsize=9)
# 标注第二部分数值(位置需加上第一部分高度)
for i, bar in enumerate(bars2):
height = bar.get_height()
bottom = values1[i] # 第一部分的高度作为第二部分的底部
plt.text(bar.get_x() + bar.get_width()/2., bottom + height/2,
f'{height}', ha='center', va='center', fontsize=9)
# 标注第三部分数值(位置需加上前两部分高度之和)
for i, bar in enumerate(bars3):
height = bar.get_height()
bottom = values1[i] + values2[i] # 前两部分高度之和作为第三部分的底部
plt.text(bar.get_x() + bar.get_width()/2., bottom + height/2,
f'{height}', ha='center', va='center', fontsize=9)
plt.title('带数值标注的堆叠条形图')
plt.xlabel('类别')
plt.ylabel('数值')
plt.legend()
plt.show()
可视化结果如下图所示:

-
示例 4:添加误差条:
在数据可视化中,除了展示数据本身,常常还需要呈现数据的不确定性或误差范围(如测量误差、统计标准差等)。Matplotlib 的bar()函数通过yerr和xerr两个参数,能轻松实现误差条的添加,让图表信息更完整、严谨。
其中,yerr是bar()函数中最常用的误差参数,用于在垂直长条图的y 轴方向(即长条高度方向) 添加误差条,直观展示数据在垂直维度的波动范围。表示长条高度(height参数)对应的误差范围,误差条会以长条为中心,向上、向下延伸,延伸长度由yerr的数值决定。
假设我们有 1-5 月的销售额数据,且已知每个月销售额的标准差(反映数据波动),用yerr添加误差条展示波动范围:
# 1. 准备数据(销售额+对应的标准差)
months = ['1月', '2月', '3月', '4月', '5月']
sales = [150, 220, 180, 250, 210] # 销售额(万元)
sales_std = [8, 12, 9, 15, 10] # 每个月销售额的标准差(误差范围)
# 2. 创建画布
plt.figure(figsize=(10, 6), dpi=100)
# 3. 绘制带垂直误差条的长条图
bars = plt.bar(
x=months,
height=sales,
label='月度销售额',
yerr=sales_std, # 添加垂直误差条(使用标准差作为误差)
capsize=5, # 误差条横线帽长度(5磅)
error_kw={ # 误差条样式配置(通过error_kw传入)
'ecolor': '#E74C3C', # 误差条颜色(红色,与长条区分)
'linewidth': 1.2 # 误差条线宽
}
)
# 4. 完善图表元素(参考基础案例)
plt.title('条形图误差线示例', fontsize=16, pad=20)
plt.xlabel('月份', fontsize=12, labelpad=10)
plt.ylabel('销售额(万元)', fontsize=12, labelpad=10)
plt.legend(fontsize=10)
plt.grid(axis='y', alpha=0.3, linestyle='--')
# 5. 添加数值标注
for bar in bars:
height = bar.get_height()
plt.text(
bar.get_x() + bar.get_width()/2.,
height + 15, # 位置高于误差条顶部
f'{height}万',
ha='center', va='bottom',
fontsize=10
)
plt.tight_layout()
plt.show()
可视化结果如下图所示,其中,每个长条顶部会延伸出红色误差条,误差条长度对应sales_std的数值(如 1 月销售额误差为 ±8 万元,即实际可能在 142-158 万元之间),capsize=5让误差条两端的横线帽清晰可见,便于读者快速识别误差范围:

更多内容可以前往官网查看:
https://matplotlib.org/stable/


本篇文章来源于微信公众号: 码农设计师