一、什么是柱形图?
我们可以使用 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 饼图,用扇形展示数据的占比关系。