python必背源代码matplotlib画图代码

阿麦
阿麦
发布时间:2026-11-13| 3人浏览过
原创

整理Python中Matplotlib数据可视化的必背核心源代码,包含面向对象API标准画图模板、折线图、柱状图、散点图、多子图布局及中文字体设置,提供可直接复制运行的实用示例。

Matplotlib 绘图的核心在于掌握面向对象 API(即 fig, ax = plt.subplots())的通用骨架,配合中文字体配置与常用图表模板。在实际数据分析与工程项目中,熟记一套结构规范的标准模板和几种高频图表的传参模式,就能直接解决日常 90% 以上的可视化需求,同时规避中文乱码、多图状态冲突和内存泄漏问题。

python必背源代码matplotlib画图代码
图 0:Matplotlib 面向对象绘图核心系统架构与模块流转拓扑

一、运行环境初始化与中文支持必背代码

在默认安装环境下,Matplotlib 无法正常渲染中文字符,负号(-)也常被错误解析为方块乱码。这是由于默认字体库不包含中文字形且未启用标准减号映射。在每个绘图脚本或 Jupyter Notebook 单元格的最上方,应统一配置以下全局参数:

import matplotlib.pyplot as plt
import numpy as np

# 1. 必背初始化配置:设置中文字体与正常显示负号
plt.rcParams['font.sans-serif'] = ['SimHei', 'PingFang SC', 'Microsoft YaHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False

# 2. 可选工程优化:提升屏幕与交互渲染清晰度
plt.rcParams['figure.dpi'] = 100

上述代码中,font.sans-serif 提供了一个按优先级回退的字体列表:在 Windows 系统上优先加载黑体(SimHei),在 macOS 系统上回退至苹方(PingFang SC),确保跨平台运行时中文字符均能被正确识别。axes.unicode_minus = False 强制 Matplotlib 使用 ASCII 破折号代替 Unicode 负号,彻底根除负数刻度乱码。

python必背源代码matplotlib画图代码
图 1:Matplotlib 面向对象标准绘图五步操作流程图

二、标准画图骨架:面向对象 API 核心模板

Matplotlib 提供了两种绘图接口风格:一是模仿 MATLAB 的 plt.plot() 状态机接口,二是基于显式对象操作的面向对象接口(Object-Oriented API)。在工程实践与生产代码中,强烈推荐始终使用面向对象接口。状态机接口依赖隐式的“当前活动画布”,一旦涉及多子图或异步渲染,极易产生状态污染。

以下为必须熟背的面向对象标准画图完整模板:

import matplotlib.pyplot as plt
import numpy as np

# 准备演示数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 步骤 1:显式创建顶层画布 (Figure) 与坐标系实例 (Axes)
fig, ax = plt.subplots(figsize=(8, 4.8))

# 步骤 2:在目标坐标系上调用图元绘制方法
ax.plot(x, y, color='#345E82', linewidth=2.0, linestyle='-', label='正弦波动信号')

# 步骤 3:统一配置坐标轴标签、主标题与坐标范围
ax.set_title('正弦波形时序特征', fontsize=14, fontweight='bold', pad=12)
ax.set_xlabel('时间序列 (秒)', fontsize=12)
ax.set_ylabel('信号幅值 (V)', fontsize=12)
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)

# 步骤 4:添加辅助图例与轻量工程网格
ax.legend(loc='upper right', frameon=True, facecolor='#F2F6FA', edgecolor='none')
ax.grid(True, linestyle='--', alpha=0.5, color='#C5D4E2')

# 步骤 5:高清导出图像并关闭对象释放内存
fig.savefig('sin_wave_demo.png', dpi=300, bbox_inches='tight')
plt.close(fig)

理解这套模板的关键在于理清底层对象层次:Figure 代表整张图纸,负责控制总宽高、分辨率与整体背景;Axes 代表图纸中的独立坐标系,所有实际绘图(折线、柱子、散点)与坐标轴设置都在 ax 内部完成。

python必背源代码matplotlib画图代码
图 2:Figure、Axes、Axis 与 Artist 对象层次关系与接口解剖图

三、高频图表必背核心源代码

日常业务与算法研究中最常用的图表形态为:折线图(趋势)、柱状图(对比)、散点图(关联分布)以及多子图组合。以下逐一提供精简且具备代表性的必背代码。

1. 多线折线图(Line Plot)必背代码

折线图用于呈现连续自变量下的数值走势。多条曲线同屏显示时,需通过线型(linestyle)、颜色(color)和数据点标记(marker)进行区分,避免仅靠色彩辨识。

fig, ax = plt.subplots(figsize=(8, 4.5))

months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales_a = [120, 145, 180, 165, 210, 240]
sales_b = [90, 110, 130, 150, 175, 195]

# 绘制产品 A 曲线:实线带圆点标记
ax.plot(months, sales_a, color='#345E82', linewidth=2, marker='o', markersize=6, label='产品线 A')

# 绘制产品 B 曲线:虚线带正方形标记
ax.plot(months, sales_b, color='#AD8060', linewidth=2, linestyle='--', marker='s', markersize=6, label='产品线 B')

ax.set_title('上半年产品销量增长趋势对比', fontsize=13)
ax.set_xlabel('统计月份')
ax.set_ylabel('销量 (件)')
ax.legend(loc='upper left')
ax.grid(True, linestyle=':', alpha=0.6)
fig.savefig('line_plot.png', dpi=300, bbox_inches='tight')
plt.close(fig)

2. 分组柱状图(Bar Chart)必背代码

柱状图用于展示离散分类指标的绝对量级。实现多组并列对比的关键是**手动计算 X 轴坐标的宽度偏移量**,并使用 ax.bar_label() 自动在柱顶标注数值。

categories = ['指标 A', '指标 B', '指标 C', '指标 D']
group1 = [45, 78, 62, 85]
group2 = [55, 68, 75, 92]

x = np.arange(len(categories))
width = 0.35  # 单个柱子宽度

fig, ax = plt.subplots(figsize=(8, 4.8))

# 通过 x - width/2 与 x + width/2 实现对称错位
rects1 = ax.bar(x - width/2, group1, width, label='基线模型', color='#345E82')
rects2 = ax.bar(x + width/2, group2, width, label='优化模型', color='#AD8060')

# 映射分类文字到 X 轴中心
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.set_ylabel('评测得分')
ax.set_title('模型优化前后各项性能指标对比', fontsize=13)
ax.legend()

# 必背利器:自动标注柱顶数值,无需手动调用 ax.text 循环
ax.bar_label(rects1, padding=3, fontsize=9)
ax.bar_label(rects2, padding=3, fontsize=9)

ax.set_ylim(0, 110)
fig.savefig('grouped_bar.png', dpi=300, bbox_inches='tight')
plt.close(fig)

3. 散点图与气泡图(Scatter Plot)必背代码

散点图用于探索两个数值变量的相关性。如果进一步将第三个变量映射为点的大小(s),第四个变量映射为色彩(c),即可升格为表达多维信息的气泡图。

np.random.seed(42)
n = 60
feature_x = np.random.rand(n) * 100
feature_y = feature_x * 0.8 + np.random.randn(n) * 15
bubble_size = np.random.rand(n) * 300 + 50
heat_value = feature_x + feature_y

fig, ax = plt.subplots(figsize=(8, 5))

# s 控制气泡物理面积,c 绑定数值阵列,cmap 指定色彩映射方案
scatter = ax.scatter(feature_x, feature_y, s=bubble_size, c=heat_value, 
                     cmap='Blues', alpha=0.75, edgecolors='#345E82', linewidth=1)

ax.set_title('样本多维特征关联分布图', fontsize=13)
ax.set_xlabel('特征 X')
ax.set_ylabel('特征 Y')
ax.grid(True, linestyle='--', alpha=0.4)

# 必背配置:为散点颜色映射绑定标尺色条 (Colorbar)
cbar = fig.colorbar(scatter, ax=ax)
cbar.set_label('热度指标强度', rotation=270, labelpad=15)

fig.savefig('scatter_plot.png', dpi=300, bbox_inches='tight')
plt.close(fig)

4. 多子图网格布局(Subplots)必背代码

当需要同时展示多项互相关联的指标时,利用 plt.subplots(nrows, ncols) 构建子图矩阵最为简洁。处理二维子图数组的最高效方式是调用 axes.flat 扁平化迭代器。

# 创建 2 行 2 列共 4 个子图,指定共享 X 轴
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 7), sharex=True)

x = np.linspace(0, 5, 50)
formulas = [np.sin(x), np.cos(x), np.exp(-x), x**2]
titles = ['子图 1: 正弦曲线', '子图 2: 余弦曲线', '子图 3: 指数衰减', '子图 4: 二次曲线']

# 必背技巧:使用 axes.flat 将二维数组拍平为一维循环
for idx, ax in enumerate(axes.flat):
    ax.plot(x, formulas[idx], color='#345E82', linewidth=1.8)
    ax.set_title(titles[idx], fontsize=11)
    ax.grid(True, linestyle=':', alpha=0.5)

# 必背防重叠语句:自动计算各个子图间距
fig.tight_layout()
fig.savefig('multi_subplots.png', dpi=300, bbox_inches='tight')
plt.close(fig)
python必背源代码matplotlib画图代码
图 3:常用图表核心函数语法与参数映射对照矩阵

四、细节微调与图像导出必背参数

图表的专业感往往体现在边界对齐、双轴协同与保存质量等细节设置上。以下整理三处不可或缺的代码片段:

1. 双 Y 轴图表(ax.twinx())

当同一张图内两条曲线的数值量级相差悬殊(如“交易笔数”为数十万、“转化率”为百分比)时,必须引入次级坐标轴:

fig, ax1 = plt.subplots(figsize=(8, 4.5))

x = np.arange(1, 7)
y_count = [12000, 15000, 19000, 22000, 26000, 31000]
y_rate = [2.4, 2.7, 3.1, 2.9, 3.5, 4.0]

# 主轴绘制柱状图
ax1.bar(x, y_count, color='#345E82', alpha=0.4, width=0.4, label='访问总量')
ax1.set_xlabel('季度阶段')
ax1.set_ylabel('访问人数 (人)', color='#345E82')

# 必背核心:克隆 X 轴并生成独立的第二 Y 轴
ax2 = ax1.twinx()
ax2.plot(x, y_rate, color='#AD8060', linewidth=2.5, marker='o', label='转化率')
ax2.set_ylabel('付费转化率 (%)', color='#AD8060')

fig.savefig('twinx_chart.png', dpi=300, bbox_inches='tight')
plt.close(fig)

2. 参考线与特征区间标注

在关键阈值处添加参考虚线或阴影区,能够大幅提升图表的工程解释力:

# 水平参考线 (如合格警戒线)
ax.axhline(y=60, color='#AD8060', linestyle='--', linewidth=1.2, label='及格基线')

# 垂直参考线 (如事件发生时间节点)
ax.axvline(x=4, color='#64748B', linestyle='-.', linewidth=1.2)

# 重点区间阴影覆盖 (如异常波动观察区)
ax.axvspan(xmin=3.5, xmax=5.5, color='#AD8060', alpha=0.15)

3. 高保真导出参数

默认执行 plt.savefig("demo.png") 时,外部坐标标签与标题常因边界留白不足而被直接裁切。请始终按如下参数导出:

fig.savefig(
    'final_report.png', 
    dpi=300,                  # 满足印刷与论文出版级分辨率
    bbox_inches='tight',      # 自动收紧边缘,彻底杜绝文字裁切
    transparent=False,        # 保持不透明白色背景,防止插入文档时反色黑底
    facecolor='#FFFFFF'
)
plt.close(fig)               # 彻底释放画布句柄,杜绝循环批量画图时的内存泄漏
python必背源代码matplotlib画图代码
图 4:Matplotlib 常用场景选型与参数调优决策拓扑图

五、工程实践常见问题排查

常见现象 / 报错 成因定位 标准修复代码
中文字符呈现白色方块(豆腐块) Matplotlib 默认字体缺少中文字形字库。 plt.rcParams['font.sans-serif'] = ['SimHei', 'PingFang SC', 'sans-serif']
负数符号显示为方块或乱码 启用 Unicode 负号但当前中文字体缺少该符号。 plt.rcParams['axes.unicode_minus'] = False
多子图标题与 X 轴刻度文字严重重叠 默认网格间距过紧,未自适应标签高度。 在 savefig 前调用 fig.tight_layout() 或创建时声明 layout='constrained'。
批量生成图片时内存不断上涨直至崩溃 未显式销毁旧的 Figure 对象,后台句柄持续驻留。 每次绘图导出后严格执行 plt.close(fig)。
保存出的 PNG 图片四周文字被切去一半 默认裁剪边界未计算坐标轴标签的额外外边距。 在 savefig 中添加 bbox_inches='tight'。
代码速记法则: 记住“初始化配字体、创建画布得两个对象(fig, ax)、绘图全在 ax 调、防重叠紧凑排、保存收紧闭内存”。牢记这套五步闭环,即可游刃有余地完成绝大多数 Python 数据可视化任务。
相关专题:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。