Python画图入门:用matplotlib绘制第一张折线图
面向Python初学者的matplotlib实用折线图绘制教程。从环境安装、极简示例、核心对象结构解析,到坐标轴配置、图例网格添加以及中文乱码等常见问题排查,带你一步步掌握第一张折线图的标准绘制流程。
一、基础准备:认识 matplotlib 与环境安装
matplotlib 是 Python 科学计算与数据分析领域中使用最广泛的绘图工具包。在日常开发中,我们通常不会直接操作其底层的复杂底层接口,而是使用它提供的子模块 matplotlib.pyplot。该模块封装了大量高级绘图函数,其使用风格与 MATLAB 类似,非常契合快速数据探索与可视化分析。
在开始写绘图代码之前,需确保开发环境中已正确安装该库。打开系统的终端(macOS/Linux 为 Terminal,Windows 为 PowerShell 或命令提示符 CMD),执行以下命令进行安装:
pip install matplotlib
如果你使用的是 Jupyter Notebook 或 Anaconda 虚拟环境,可以直接在代码单元格中输入 !pip install matplotlib 并运行。安装完成后,可以通过一段极简的 Python 导入语句来验证是否安装成功:
import matplotlib
import matplotlib.pyplot as plt
print(matplotlib.__version__)
若终端输出了类似 3.8.0 的版本号且没有抛出 ModuleNotFoundError 错误,说明安装无误,可以进入后续代码编写。
二、核心步骤:用 5 行代码绘制第一张折线图
学习绘图最有效的方式是从最小可运行代码入手。新建一个名为 first_plot.py 的文件,输入以下 5 行核心代码并保存:
import matplotlib.pyplot as plt
# 准备横纵轴数据(例如 5 个采样点的序号与数值)
x = [1, 2, 3, 4, 5]
y = [2, 5, 4, 9, 7]
# 执行折线图绘制与渲染呈现
plt.plot(x, y)
plt.show()
在终端中运行该脚本:
python first_plot.py
执行后,你的屏幕上会弹出一个独立的 GUI 绘图窗口。窗口中央绘制了一条连续的蓝色折线,折线的转折点分别对应于 (1, 2)、(2, 5)、(3, 4)、(4, 9) 和 (5, 7) 这五个离散点。
逐行原理解释
-
import matplotlib.pyplot as plt:导入pyplot并约定俗成地重命名为plt。以后所有的绘图命令几乎都以plt.开头。 -
x = [...]与y = [...]:分别定义折线图的横轴(自变量)和纵轴(因变量)。在 matplotlib 中,只要是一维可迭代对象(如 Python 原生list、元组、NumPy 数组或 Pandas Series),都可以直接传入。 -
plt.plot(x, y):核心绘图函数。它做的事情是:按照索引顺序将每一个(x[i], y[i])坐标点定位在二维平面上,然后使用直线段将相邻的点依次首尾连接。如果不指定其他参数,它会自动计算横纵轴的取值范围,并使用默认样式(默认纯实线、默认蓝色)绘制。 -
plt.show():将内存中构建好的图表真正渲染到屏幕上。如果忽略此行,脚本在后台执行完计算后便会直接退出,不会展示任何可视化图形。
三、核心对象解剖:Figure 与 Axes 的层级关系
很多初学者在使用 matplotlib 一段时间后,常常会感到困惑:有时候看到别人用 plt.title(),有时候又看到别人写 ax.set_title(),这两者究竟有什么区别?
理解这一点的关键在于搞清楚 matplotlib 的内部层级架构。在 matplotlib 的世界里,图表是由不同的容器层层嵌套构建而成的:
- Figure(画布):整个可视化的顶级容器,相当于画家的画板。它包含了窗口的大小(figsize)、背景色、分辨率(DPI)以及上面所有的子图和文字。
- Axes(坐标系/子图):真正用于绘图的物理区域,相当于画纸上的某个具体区域。折线、柱子、散点等所有图元(Artist)都绘制在 Axes 之上。一个 Figure 可以只包含一个 Axes,也可以划分成网格包含多个 Axes。
- Axis(坐标轴):位于 Axes 内部的具体维度控制器,分为 XAxis 和 YAxis。它负责刻度线(Ticks)、刻度数值标签(TickLabels)以及轴标题(Label)的计算与放置。
-
Line2D(图元线条):由
plot()函数生成的具体几何线条,拥有颜色、线宽、线型、标记点等视觉属性。
前面我们在第二节使用的是 plt.plot(),这是 pyplot 快捷接口(它会在后台自动为你创建当前的 Figure 和 Axes);而在规范的工程代码中,更推荐使用 面向对象接口(Object-Oriented API),即:
# 推荐写法:显式创建画布 figure 与坐标系 ax
fig, ax = plt.subplots(figsize=(8, 4.5))
ax.plot(x, y)
plt.show()
这种写法将画布(fig)和坐标系(ax)明确分开,当你需要在一张图里画多个并列的子图,或者对坐标轴进行精细调整时,逻辑会清晰得多。
四、进阶美化:为第一张折线图赋予完整语义
仅仅画出一条没有标题、没有轴名称的折线,在实际业务和科研报告中是无法被他人看懂的。一张合格的折线图,必须具备清晰的 标题、坐标轴含义及单位、数据图例 以及用于辅助肉眼对齐数值的 参考网格。
下面是一个包含完整语义标注、线条美化及保存功能的完整示例代码:
import matplotlib.pyplot as plt
# 解决中文字体显示问题(Windows 优先选择 SimHei,macOS 优先选择 PingFang HK 或 Arial Unicode MS)
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 1. 准备数据
days = ['周一', '周二', '周三', '周四', '周五']
temperatures = [12, 18, 15, 26, 21]
# 2. 创建画布与坐标系
fig, ax = plt.subplots(figsize=(7, 4))
# 3. 绘制带有颜色、虚线以及标记点的折线
ax.plot(days, temperatures,
color='#345E82', # 线条颜色(支持 16 进制颜色码)
linestyle='--', # 线型:虚线
linewidth=2, # 线条粗细
marker='o', # 数据拐点标记:圆形
markersize=6, # 标记点大小
markerfacecolor='#AD8060', # 标记点内部填充色
label='实测温度') # 用于图例的文本标签
# 4. 补充图表语义信息
ax.set_title('工作日白天最高气温趋势', fontsize=14, pad=12)
ax.set_xlabel('时间', fontsize=11)
ax.set_ylabel('温度 (°C)', fontsize=11)
# 5. 打开虚线辅助网格
ax.grid(True, linestyle=':', alpha=0.6)
# 6. 显示图例(默认根据 label 自动生成)
ax.legend(loc='upper left')
# 7. 保存图片并展示(注意:保存必须在 show() 之前)
plt.savefig('weekly_temp.png', dpi=300, bbox_inches='tight')
plt.show()
| 参数名 | 常见取值示例 | 实际作用说明 |
|---|---|---|
color |
'#345E82', 'red', 'blue' |
定义折线的颜色,支持标准英文颜色名或十六进制 RGB 码。 |
linestyle |
'-'(实线), '--'(虚线), ':'(点线), '-.'(点划线) |
控制线条的形态,便于在多条折线并存时通过线型区分。 |
marker |
'o'(圆点), 's'(方块), '^'(三角形), '*'(星号) |
在每个具体的数据坐标点上绘制符号标记,凸显关键离散数据。 |
label |
'2026年数据' |
为当前线条定义图例名称,配合 ax.legend() 一起使用。 |
五、入门避坑:初学折线图常见问题与排查
初学者在刚刚接触 matplotlib 时,往往会遇到几个非常典型的问题。通过以下针对性的排查清单,可以快速定位并修复:
1. 中文字符显示为白色方框或乱码
现象:图表标题或坐标轴上的中文汉字变成了方框(□□)或问号,并在终端输出 Glyph missing from current font 警告。
原因:matplotlib 默认使用的无衬线字体是 DejaVu Sans,该英文字体内置字符集并不包含中文字符。
解决方法:在脚本头部配置当前操作系统中已安装的中文字体族:
# 跨平台中文设置配置
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号 '-' 显示为方块的问题
2. 保存的图片文件是一张全白空白图
现象:调用了 plt.savefig('output.png'),打开生成的图片后发现整个画面全是空白。
原因:把 plt.savefig() 写在了 plt.show() 之后。在调用 plt.show() 关闭交互窗口后,matplotlib 内部会自动清空当前活动的 Figure 画布。因此后续执行的 savefig() 实际上保存了一块已被清空的空画布。
解决方法:始终在 plt.show() 之前调用 plt.savefig();或者使用面向对象句柄 fig.savefig('output.png') 保存。
3. 报错:x and y must have same first dimension
现象:控制台抛出 ValueError: x and y must have same first dimension, but have shapes (4,) and (5,)。
原因:传入 plot(x, y) 的 x 列表与 y 列表长度不相等。每个数据点必须具备一个唯一的 x 与 y 对应。
解决方法:在调用前检查 len(x) == len(y)。
六、总结与实践建议
绘制第一张折线图并不复杂,核心脉络可以总结为四个词:导包、列数、连线、修饰。
-
建立良好习惯:在实际项目中,优先采用
fig, ax = plt.subplots()的面向对象语法,而不是过度依赖全局plt隐式状态机。这样能为以后绘制多子图、双坐标轴或复杂排版打下坚实基础。 -
控制视觉复杂度:折线图的核心目的是展现“变化趋势”。折线颜色尽量与背景产生明确对比,单张图内同向比较的折线尽量不超过 5 条,必要时配合
marker和虚线等线型加以辅助区分。 -
规范保存流程:在自动化脚本或数据处理管道中,结合
matplotlib.use('Agg')和plt.savefig('output.png', dpi=300, bbox_inches='tight'),可以稳定输出印刷级的高清矢量或位图文件。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









