Matplotlib绘图基础步骤:从零到精通的完整指南
目录导读
- Matplotlib是什么?为什么它是Python数据可视化的首选?
- Matplotlib绘图的基础流程图
- 安装与导入Matplotlib
- 创建画布与子图
- 准备数据并绘图
- 定制图形元素(标题、标签、网格、图例)
- 美化与样式调整
- 显示或保存图形
- 常见问题与QA
- 进阶提示:从基础到高效
Matplotlib是什么?为什么它是Python数据可视化的首选?
Matplotlib是Python生态中最经典、最基础的2D绘图库,它能够生成出版级质量的图表,支持折线图、散点图、柱状图、饼图、热力图等几乎所有的常见图形类型,无论你是做数据分析、机器学习可视化,还是科研论文配图,Matplotlib都是绕不开的核心工具。
相比其他可视化库(如Seaborn、Plotly、Bokeh),Matplotlib的最大优势在于高度可控——你可以控制图上的每一个像素,从坐标轴的刻度到线条的粗细,几乎是“所见即所得”,虽然它的API较为底层,但掌握基础绘图步骤后,就能轻松驾驭。
一个典型的使用场景:你拿到了某电商平台一周的日销售额数据,想画一条清晰的时间趋势折线图,并标注最大值和最小值,这时你就需要Matplotlib的基础绘图能力。
Matplotlib绘图的基础流程图
在深入代码之前,我们先理清一幅Matplotlib图形从无到有的核心流程,这个流程适用于90%以上的图表绘制:
- 安装与导入 → 2. 创建Figure和Axes → 3. 准备数据和绘图 → 4. 定制元素(标题、标签、刻度) → 5. 美化调整(颜色、线型、样式) → 6. 显示/保存
注意:在实际项目中,“准备数据”往往是第一步,但从绘图步骤的视角来看,我们把它放在创建画布之后,因为绘图函数需要接收数据作为参数。
步骤一:安装与导入Matplotlib
安装
如果尚未安装Matplotlib,请在终端执行:
pip install matplotlib
如果你使用的是Anaconda发行版,通常已经预装了Matplotlib。
导入
标准导入方式有两种:
# 方式一:导入pyplot模块,这是最常用的方式 import matplotlib.pyplot as plt # 方式二:导入整个matplotlib库(较少用,但在需要修改全局配置时会用到) import matplotlib
其中plt是约定俗成的别名,后续所有绘图函数都通过plt调用。plt.plot(), plt.title()。
提示:为了让图片在Jupyter Notebook中直接显示,需要在最上方加上一行魔法命令:
%matplotlib inline
步骤二:创建画布与子图
创建画布(Figure)
fig = plt.figure(figsize=(10, 6)) # 创建一个10英寸宽、6英寸高的画布
figsize控制整个图形的尺寸比例,单位是英寸,如果不指定,默认大小为6.4x4.8。
创建子图(Axes)
我们可以用两种方式在画布上添绘画区域(Axes):
方式A:最常用的单图模式
fig, ax = plt.subplots(figsize=(10, 6))
这个ax就是我们要画图的核心对象,所有绘图操作都可以通过ax方法来调用,比如ax.plot(), ax.set_title()。
方式B:多子图布局(例如2行3列)
fig, axes = plt.subplots(2, 3, figsize=(15, 8)) # axes是一个2x3的二维数组,axes[0][0]代表第一行第一列的子图
对于初学者来说,建议先掌握单图模式(方式A),因为几乎所有基础问题都可以用单图解决。
步骤三:准备数据并绘图
准备数据
以最简单的折线图为例,我们准备两个列表:
x = [1, 2, 3, 4, 5] y = [10, 15, 13, 18, 20]
真实项目中数据通常来自Pandas DataFrame或NumPy数组,但原理一致。
绘图
使用ax.plot()绘制折线图:
ax.plot(x, y)
如果想画散点图,用ax.scatter();柱状图用ax.bar();饼图用ax.pie(),这里以最常用的折线图为例。
关键点:此时图形已经存在,但非常“原始”——没有标题、没有坐标轴标签、没有网格线。
步骤四:定制图形元素(标题、标签、网格、图例)
这是使图形从“可用”变为“可读”的关键步骤。
# 设置x轴和y轴标签
ax.set_xlabel("天数", fontsize=12)
ax.set_ylabel("销售额(万元)", fontsize=12)
# 设置x轴刻度(例如显示文字而不是数字)
ax.set_xticks(x)
ax.set_xticklabels(["周一","周二","周三","周四","周五"])
# 添加网格线(便于观察数据)
ax.grid(True, linestyle='--', alpha=0.7)
# 添加图例(当有多条线时重要)
ax.plot(x, y, label="实际销售额")
ax.legend(loc='upper left') # 指定图例位置
注意:set_title(), set_xlabel(), grid(), legend()等是Axes对象的方法,你也可以使用plt.title()等全局函数,但使用ax方法更推荐,因为它在多子图时不会混淆。
步骤五:美化与样式调整
颜色、线型、标记
让数据更生动:
ax.plot(x, y, color='orangered', linewidth=2.5, linestyle='-', marker='o', markersize=8)
| 参数 | 作用 | 示例值 |
|---|---|---|
color |
线条颜色 | 'blue', '#FF4500', 'coral' |
linewidth |
线条宽度 | 5 |
linestyle |
线型 | '-'实线, '--'虚线, ':'点线 |
marker |
数据点标记 | 'o'圆圈, '^'三角形, 's'方形 |
markersize |
标记大小 | 8 |
整体样式主题
Matplotlib内置了多种风格,一键切换:
plt.style.use('ggplot') # 类似R语言的ggplot风格
# 或
plt.style.use('seaborn-v0_8') # Seaborn风格
其他常用风格包括:'fivethirtyeight', 'dark_background', 'classic'。
坐标轴范围
ax.set_xlim(0.5, 5.5) # x轴显示范围 ax.set_ylim(5, 25) # y轴显示范围
步骤六:显示或保存图形
在Jupyter或脚本中显示
plt.show()
重要提醒:如果是在脚本中运行,plt.show()会阻塞程序,直到你关闭图形窗口,在Jupyter中则直接内嵌显示。
保存为文件(高质量)
# 保存为PNG
plt.savefig('sales_trend.png', dpi=300, bbox_inches='tight')
# 保存为PDF(适合出版)
plt.savefig('sales_trend.pdf', dpi=300, bbox_inches='tight')
| 参数 | 说明 |
|---|---|
dpi |
分辨率,300为出版级 |
bbox_inches='tight' |
自动裁剪掉多余的空白区域 |
注意:
savefig必须在show()之前调用,否则保存的是空图。
常见问题与QA
Q1:为什么我的图片显示出来是空白?
A:最常见的原因是你使用了plt.show()之后又调用了plt.savefig(),顺序应该是先savefig再show,第二种可能是你的数据列表为空。
Q2:如何在同一个图里画多条线?
A:多次调用ax.plot()即可,每次传入不同的数据,并指定不同的label参数,最后调用ax.legend()显示图例。
Q3:中文显示成方框(□□)怎么办?
A:Matplotlib默认字体不支持中文,解决方案有二:
方法一:使用系统支持的中文字体,
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # Mac plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
在绘图时用英文或拼音替代中文标签。
Q4:plt.plot()和ax.plot()有什么区别?
A:plt.plot()是pyplot的全局函数,自动在“当前活跃子图”上绘图,适合快速原型。ax.plot()是面向对象的方法,显式指定绘图区域,在多子图场景下,推荐使用ax.plot()以避免混淆。
Q5:如何把柱状图和折线图画在一起(双y轴)?
A:使用ax.twinx()创建共享x轴的第二个y轴,实现双坐标轴效果。
进阶提示:从基础到高效
- 使用Pandas直接绘图:如果你已经用Pandas读入了数据,可以直接用
df.plot(ax=ax),它会自动调用Matplotlib绘制,大大简化代码。 - 子图布局优化:使用
plt.subplots_adjust(wspace=0.3, hspace=0.4)调整子图间的间距。 - 交互式图表:如果想更快速地查看数据,可以尝试
%matplotlib widget或使用mplcursors库添加悬浮数据标签。 - 复杂图表参考:Matplotlib官方图库(gallery)提供了数百种场景示例,遇到复杂需求时先搜索官方示例,往往能直接套用。
Matplotlib绘图的六个基础步骤——导入→创建画布→绘图→定制→美化→显示/保存,是每一个数据从业者必须熟练掌握的链条,刚开始时可能会觉得代码琐碎,但一旦习惯这种“画布+子图+方法调用”的面向对象模式,你会发现它能帮你实现从简单折线图到复杂多子图科研配图的任何需求。
任何可视化问题,都可以在这六个步骤中寻找答案。 建议你准备一组真实数据,亲自运行一遍上述代码,你会很快找到控制画面每一处细节的掌控感。