2. 搭建Matplotlib绘图环境

在开始制作环境监测趋势报告之前,先把 Matplotlib 的运行环境搭稳,比后面反复调图要省事得多。本节围绕五件事展开:安装与导入、后端选择、中文字体配置、样式预设,以及交互模式与脚本模式的区别。它们共同决定了“图能不能画出来、画出来长什么样、在什么界面里显示”。

一、安装与导入:把依赖装对、把入口选对

Matplotlib 本身只依赖 NumPy,常规安装用 pip 即可。环境监测报告常需要读取 CSV/Excel 数据,因此通常一并安装 pandas;若数据表较大或需要更精细的刻度控制,可再加装 numpy。建议在虚拟环境中安装,避免与系统 Python 冲突:

python -m venv mplenv
# Windows: mplenv\Scripts\activate
# macOS/Linux: source mplenv/bin/activate
pip install matplotlib pandas
python -c "import matplotlib; print(matplotlib.__version__)"

导入方式有两种常见写法。第一种是面向对象风格,推荐在正式报告中采用:

import matplotlib.pyplot as plt
import pandas as pd

fig, ax = plt.subplots(figsize=(10, 4.5), dpi=120)
ax.plot(df["时间"], df["PM2.5"], color="#2f7ed8", linewidth=1.6)
ax.set_title("某监测点 PM2.5 日均值趋势")
ax.set_xlabel("时间")
ax.set_ylabel("浓度 (μg/m³)")
fig.savefig("pm25_trend.png", bbox_inches="tight")

第二种是 plt.plot(...) 的状态机风格,写起来短,适合快速探索,但多子图、多图层时容易混淆“当前坐标轴”。报告类脚本建议统一用 fig, ax 显式持有对象,后续设置标题、图例、网格都作用在明确的 ax 上,可维护性更好。

二、后端选择:图显示在哪里

“后端”是 Matplotlib 用来渲染和显示图形的底层接口。它决定了图是弹窗显示、嵌入 Notebook,还是只写文件不显示。常见后端及适用场景如下:

后端典型场景特点
TkAgg / QtAgg本地桌面脚本弹出独立窗口,可缩放、可交互
module://matplotlib_inline.backend_inlineJupyter Notebook图直接嵌入单元格输出
Agg服务器、批量出图无界面,只写 PNG/SVG/PDF,速度快

选择方式有两种:在代码最前面调用 matplotlib.use("Agg"),或在无图形界面的服务器上让 Matplotlib 自动回退到 Agg。注意 use() 必须在导入 pyplot 之前执行,否则可能不生效。批量生成日报图时,用 Agg 后端配合 savefig 是最稳妥的组合;而在本地调试阶段,用 TkAgg 弹窗逐张检查更直观。

三、中文字体配置:让标题和标签不乱码

Matplotlib 默认字体不含中文字形,直接写中文标题会出现方框。解决办法是显式指定系统中存在的中文字体,并同时修正负号显示。Windows 常用“Microsoft YaHei”或“SimHei”,macOS 常用“PingFang SC”或“Heiti SC”,Linux 可安装“Noto Sans CJK SC”。配置一次即可全局生效:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei", "SimHei", "Noto Sans CJK SC"]
plt.rcParams["axes.unicode_minus"] = False  # 负号正常显示

如果配置后仍显示方框,先用 matplotlib.font_manager 查询字体是否被识别,再确认字体名称拼写与系统实际名称一致。环境监测图常出现“μg/m³”这类单位,上标字符依赖字体覆盖范围,建议在标题中直接写“微克/立方米”或确认所选字体包含该字形,避免导出后单位缺失。

四、样式预设:统一报告视觉语言

Matplotlib 内置了 ggplot、seaborn-v0_8、bmh 等样式,可用 plt.style.use("ggplot") 一键切换。但环境监测报告往往有固定的配色与字号规范,更实用的做法是基于 rcParams 定义一套项目样式:统一网格线、字号、图例位置和主色,让日报、周报、月报的图看起来像同一套体系。样式设置应放在绘图之前,且只设置一次,避免每个图重复写。

建议把字体、样式、后端三项配置集中写进一个 plot_config.py,各报告脚本 import 后直接使用。这样换机器或换字体时只改一处,不会出现“这张图中文正常、那张图乱码”的情况。

五、交互模式与脚本模式:什么时候显示、什么时候阻塞

这是初学者最容易踩坑的地方。脚本模式下,plt.show() 会阻塞程序,直到关闭窗口才继续执行;交互模式下(plt.ion()),图会立即刷新但不阻塞,适合边算边看、动态更新曲线。两者的关键差异在于“是否阻塞”和“何时渲染”。

Matplotlib 绘图环境搭建与运行模式 环境配置链 安装 matplotlib / pandas 虚拟环境隔离依赖 选择后端 Backend Agg / TkAgg / inline 配置中文字体 font.sans-serif + 负号 应用样式预设 rcParams / style.use 配置集中到 plot_config.py 脚本模式 vs 交互模式 脚本模式(默认) 创建 fig / ax 绘制曲线、设置标签 plt.show() 阻塞等待关闭 关闭后继续执行后续代码 适合:批量出图、报告生成 交互模式 plt.ion() 开启 ion() 后创建图形 draw() / pause() 即时刷新 不阻塞,可继续更新数据 结束时 plt.ioff() 收尾 适合:调试、动态监测曲线

实际写报告脚本时,推荐默认使用脚本模式:数据读入、绘图、savefig 一气呵成,不依赖人工关闭窗口,便于定时任务和批量运行。只有在调试阶段需要反复观察中间结果时,才临时开启 plt.ion(),并在结束前调用 plt.ioff() 恢复。若在 Notebook 中,内联后端本身就会自动显示图形,通常不需要手动调用 show()。

常见问题:在脚本里既调用了 plt.ion() 又忘记 plt.ioff(),导致后续 show() 不阻塞、程序瞬间结束、窗口一闪而过。排查时先检查是否残留交互模式设置,再确认后端是否为无界面的 Agg。