Matplotlib入门教程(十):柱形图详解——bar() 与 barh() 函数完全指南

一、什么是柱形图?

我们可以使用 pyplot 中的 bar() 方法来绘制柱形图。

柱形图的作用:

作用 说明
类别对比 直观比较不同类别的数值大小
排名展示 按数值排序,突出高低差异
构成分析 配合堆叠展示部分与整体
趋势观察 类别有序时也能体现趋势

柱形图 vs 散点图:

对比项 柱形图 散点图
x 轴类型 类别(离散) 数值(连续)
主要用途 对比大小 观察关系
典型场景 销售额排名 身高体重关系
二、bar() 函数语法

python

复制代码
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *,
                      align='center', data=None, **kwargs)

参数说明:

参数 说明
x 浮点型数组,柱形图的 x 轴数据
height 浮点型数组,柱形图的高度
width 浮点型数组,柱形图的宽度,默认 0.8
bottom 底座的 y 坐标,默认 0(用于堆叠)
align 对齐方式,'center'(默认)或 'edge'
**kwargs 其他参数,如颜色、边框等

关于 align 参数:

值 效果
'center' 以 x 位置为中心(默认)
'edge' 左边缘与 x 位置对齐

技巧: 要对齐右边缘的条形,可以传递负数的宽度值及 align='edge'。

三、基础柱形图

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.bar(x, y)
plt.show()

效果: 四个类别,柱高对应 y 值,x 轴显示类别名称。

四、水平条形图(barh)

垂直方向的柱形图可以使用 barh() 方法来设置:

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.barh(x, y)
plt.show()

bar() 与 barh() 对比:

对比项 bar() barh()
方向 垂直 水平
第一个参数 x 轴类别 y 轴类别
第二个参数 高度(height) 宽度(width)
宽度参数 width height
适用场景 类别名称较短 类别名称较长

实践建议: 当类别名称较长(如中文标题)时,用 barh() 可以避免 x 轴标签重叠或倾斜。

五、设置柱形图颜色
1. 统一颜色

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.bar(x, y, color="#4CAF50")
plt.show()

颜色写法:

写法 示例
单字符 color='r'
命名颜色 color='hotpink'
十六进制 color='#4CAF50'
2. 自定义各个柱形的颜色

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.bar(x, y, color=["#4CAF50", "red", "hotpink", "#556B2F"])
plt.show()

要点: color 传入数组时,长度需与类别数量一致,为每个柱子单独指定颜色。

应用场景: 用不同颜色突出特定类别,如最大值、最小值或达标/未达标项。

六、设置柱形图宽度

bar() 方法使用 width 设置宽度,barh() 方法使用 height 设置宽度。

1. 垂直柱形图宽度

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.bar(x, y, width=0.1)
plt.show()
2. 水平条形图宽度

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.barh(x, y, height=0.1)
plt.show()

宽度取值参考:

宽度值 效果
0.1 很细,适合多组对比
0.5 较细
0.8 默认值
1.0 柱子相连

注意: 宽度不要超过 1.0,否则相邻柱子会重叠。

七、常用参数速查
参数 作用 示例
color 柱子颜色 color='#4CAF50'
width 垂直柱宽度 width=0.5
height 水平条宽度 height=0.5
bottom 底部起始位置 bottom=10
align 对齐方式 align='edge'
edgecolor 边框颜色 edgecolor='black'
linewidth 边框宽度 linewidth=1.5
alpha 透明度 alpha=0.8
label 图例标签 label='2024年'
八、实战:完整柱形图

python

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 中文配置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 数据
categories = np.array(["产品A", "产品B", "产品C", "产品D", "产品E"])
sales = np.array([120, 220, 60, 180, 150])

# 绘图:最大值用红色高亮
colors = ['#4CAF50' if v < max(sales) else '#e74c3c' for v in sales]

plt.figure(figsize=(8, 5))
bars = plt.bar(categories, sales, color=colors, width=0.6,
               edgecolor='black', linewidth=0.5)

# 在柱顶显示数值
for bar, value in zip(bars, sales):
    plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 3,
             str(value), ha='center', va='bottom', fontsize=11)

plt.title("各产品销售额对比", fontsize=16)
plt.xlabel("产品", fontsize=12)
plt.ylabel("销售额(万元)", fontsize=12)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

技巧解析:

技巧 实现
最大值高亮 列表推导式生成颜色数组
柱顶显示数值 plt.text() 配合 bar.get_x()、bar.get_height()
边框 edgecolor='black'、linewidth=0.5
横向网格 plt.grid(axis='y', alpha=0.3)

text 定位说明: bar.get_x() + bar.get_width()/2 计算柱子中心 x 坐标,bar.get_height() 获取柱高,ha='center'、va='bottom' 让文字居中显示在柱顶上方。

九、柱形图绘制流程图
十、常见问题排查
问题现象 可能原因 解决方案
x 轴标签重叠 类别名过长或过多 改用 barh() 或旋转标签
柱子重叠 width 超过 1.0 调小宽度值
颜色数组报错 长度与类别数不符 确保颜色数量一致
中文显示为方块 未配置字体 设置 font.sans-serif
负值柱子方向不对 未考虑 bottom 负值柱子自动向下延伸
柱顶数值错位 定位计算错误 用 bar.get_x() 系列方法
柱子间距过大 width 太小 适当增大 width
十一、小结

本篇你掌握了 Matplotlib 柱形图的完整用法:

  • bar() 函数 :x 为类别,height 为高度,width 控制宽度。

  • barh() 函数:水平条形图,适合类别名称较长的场景。

  • 颜色定制 :color 可传单值或数组,支持单字符、命名色、十六进制。

  • 宽度控制 :bar() 用 width,barh() 用 height。

  • 实用技巧 :edgecolor 加边框、plt.text() 显示数值、alpha 调透明度。

柱形图是类别对比的首选图表。下一篇我们将学习 Matplotlib 饼图,用扇形展示数据的占比关系。

相关推荐
ctlover3 天前
Matplotlib
matplotlib
for_ever_love__5 天前
Matplotlib——把训练曲线和分布画出来
matplotlib·数据可视化·大模型开发·训练曲线
茶栀(*´I`*)11 天前
【Python数据可视化】Matplotlib从零到精通:图表核心解剖、多子图布局与三大经典图表实战
python·信息可视化·matplotlib
jzshmyt23 天前
我用 Python 从零“生成“了一个宇宙,然后让它观察自己(v14)
人工智能·pytorch·python·numpy·matplotlib·空间计算·scipy
小葱炖豆腐1 个月前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
七灵微1 个月前
【AI】代码实战- 基于时间序列的轴承检测1
人工智能·机器学习·ai·pandas·matplotlib
微小冷1 个月前
pyqt+matplotlib多进程图像刷新
pyqt·matplotlib·进程通信·多进程·queue·process
㳺三才人子2 个月前
初探 Data Analysis - Matplotlib
python·plotly·pandas·matplotlib
菜冻鱼2 个月前
Python-sklearn-特征工程
开发语言·人工智能·python·机器学习·numpy·matplotlib·sklearn