4、Matplotlib基础:Figure与Axes概念,绘制第一张统计图(柱状图)
4.1 先聊聊Figure和Axes到底是个啥
说实话,我刚学Matplotlib那会儿,也被Figure和Axes这两个概念绕晕过。你想想看,一个叫「画布」,一个叫「坐标系」,听起来挺像的,但实际分工完全不同。
我个人习惯这么理解:Figure就是一张白纸,Axes就是白纸上画图的那个区域。一张白纸上可以画一张图,也可以画多张图——这就是Figure和Axes的关系。
举个例子。你在Excel里新建一个工作簿,这个工作簿就是Figure。你在工作簿里插入一个图表,这个图表所在的区域就是Axes。一个工作簿可以有好几个图表,对吧?Matplotlib里也一样。
核心概念速记:
- Figure:顶层容器,相当于整张画布
- Axes:实际绘图区域,包含坐标轴、刻度、数据等
- 一个Figure可以包含多个Axes
- 没有Axes,你什么都画不了
4.2 代码里怎么创建它们?
直接上代码。我习惯用plt.subplots()来创建,一步到位。
import matplotlib.pyplot as plt
# 创建一个Figure和一个Axes
fig, ax = plt.subplots()
# 看看它们是什么类型
print(type(fig)) # <class 'matplotlib.figure.Figure'>
print(type(ax)) # <class 'matplotlib.axes._axes.Axes'>
# 显示一下
plt.show()
运行这段代码,你会看到一个空白的窗口。别急,它确实什么都没画,但Figure和Axes已经准备好了。
如果你想在一张画布上画多个子图,可以这样:
# 创建2行2列的子图,共4个Axes
fig, axes = plt.subplots(2, 2)
# axes是一个2x2的数组
print(axes.shape) # (2, 2)
plt.show()
嗯,这里要注意:subplots返回的axes是一个NumPy数组。你可以通过索引来访问每个子图,比如axes[0, 0]就是左上角那个。
4.3 绘制第一张柱状图
理论说完了,咱们来画点实在的。柱状图是数据分析里最常用的图表之一,我当年做数据标注质量分析时,第一张图就是柱状图——用来展示不同标注员的准确率对比。
先准备点数据:
# 数据:不同类别的标注数量
categories = ['人物', '地点', '时间', '事件', '物品']
counts = [120, 85, 63, 97, 45]
然后画图:
fig, ax = plt.subplots()
# 绘制柱状图
ax.bar(categories, counts, color='skyblue', edgecolor='navy')
# 添加标题和标签
ax.set_title('各类别标注数量统计', fontsize=14)
ax.set_xlabel('标注类别', fontsize=12)
ax.set_ylabel('数量', fontsize=12)
# 显示数值
for i, v in enumerate(counts):
ax.text(i, v + 2, str(v), ha='center', fontsize=10)
plt.show()
这段代码跑完,你应该能看到一张漂亮的柱状图。每个柱子代表一个类别,高度对应数量。我在项目里经常用这个模式,改改数据就能用。
小技巧:颜色参数color和边框参数edgecolor可以快速美化图表。我个人喜欢用skyblue配navy,清晰又不刺眼。
4.4 避坑指南:我曾经踩过的坑
讲几个我实际遇到过的问题,你遇到了可以少走弯路。
坑一:忘记调用plt.show()
我曾经在Jupyter Notebook里写了一大段代码,怎么都看不到图。折腾了半天才发现——忘了加plt.show()。在脚本模式下,这个函数是必须的。不过在Jupyter里,如果你用了%matplotlib inline,它会自动显示。
坑二:中文显示乱码
Matplotlib默认不支持中文。我第一次画图时,标题里的中文全变成了小方块。解决方案是设置字体:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
这两行代码建议放在脚本开头,全局生效。
坑三:柱状图柱子太挤或太宽
默认情况下,柱子的宽度是0.8。如果你的类别很多,可以调小一点:
ax.bar(categories, counts, width=0.6) # 调窄柱子
注意:调整width参数时,记得同时调整ax.text()里的位置偏移量,否则数值标签会错位。
4.5 本章知识体系
下面这张图帮你理清Figure和Axes的关系,以及柱状图的绘制流程:
4.6 完整代码模板
最后,给你一个可以直接用的模板。我每次做数据可视化都从这开始改:
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
# 创建画布和坐标系
fig, ax = plt.subplots(figsize=(8, 5))
# 画柱状图
bars = ax.bar(categories, values, color='lightcoral', edgecolor='darkred', width=0.6)
# 添加数值标签
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 1,
f'{height}', ha='center', va='bottom', fontsize=10)
# 标题和标签
ax.set_title('柱状图示例', fontsize=16, fontweight='bold')
ax.set_xlabel('类别', fontsize=12)
ax.set_ylabel('数值', fontsize=12)
# 网格线(可选)
ax.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
这个模板里我加了figsize控制画布大小,tight_layout自动调整布局,省得标签被切掉。你拿去用,改改数据和颜色就行。
总结一下:
- Figure是画布,Axes是绘图区
- 用
plt.subplots()创建最方便 - 柱状图用
ax.bar(),记得加数值标签 - 中文显示要设置字体,别忘了我说的那两行代码
好了,这一章就到这儿。你动手试试,把数据换成你自己的,看看效果。画图这事儿,多练几次就熟了。