7.4 布局、样式与可复用绘图函数
一个面板应回答一个连贯比较。当问题需要多个互补视图时,布局要建立阅读顺序,而不是堆放一组声音同样响亮的图。
在多个 Axes 之间建立视觉层次
规则网格写法很紧凑:
fig, axs = plt.subplots(
2,
2,
figsize=(10, 7),
layout="constrained",
)
for ax in axs.flat:
ax.grid(axis="y", alpha=0.2)多面板网格中的 axs 是 NumPy 数组,.flat 可以简单迭代所有元素。只有面板使用相同变量、单位、尺度和有意义范围时,才共享 x 轴或 y 轴。共享轴会同步范围,不只是隐藏重复标签。强行共享不相关范围,可能压扁某个面板并暗示不存在的直接可比性。
具有主次关系的仪表板可以使用 subplot_mosaic 命名面板,并让主视图跨越多个网格单元:
fig, axd = plt.subplot_mosaic(
[
["trend", "trend"],
["region", "distribution"],
],
figsize=(10, 7),
height_ratios=[1.4, 1],
layout="constrained",
)
axd["trend"].plot(daily["date"], daily["sales"])
axd["region"].barh(region_sales.index, region_sales.values)
axd["distribution"].hist(order_values, bins="fd")返回字典使面板意图直接可读。Figure 级总标题说明共同问题,每个面板使用简短标题。只有在含义仍明确时,才能删除重复轴标签和图例。
layout="constrained" 会请 Matplotlib 为标题、轴标签、刻度标签、图例和色条预留空间。它比事后调用 tight_layout() 更灵活,而且 tight_layout() 会关闭 constrained layout。但自动布局不能证明输出合格:画布过小、翻译文字过长、外部 Artist 或不同后端字体仍可能造成拥挤与裁切。
把样式限制在局部,让绘图函数可组合
样式表会配置许多 Artist 默认值。通过 plt.rcParams[...] 永久修改全局设置,可能泄漏到无关 notebook 单元格和测试。只服务一项输出的样式应放在上下文中:
import matplotlib as mpl
import matplotlib.pyplot as plt
with plt.style.context("default"), mpl.rc_context({
"font.size": 10,
"axes.titleweight": "bold",
"axes.spines.top": False,
"axes.spines.right": False,
}):
fig, ax = plt.subplots(layout="constrained")
artists = draw_monthly_sales(ax, monthly)样式可以传达层次,但不能改变证据。装饰性渐变、三维透视和过多视觉墨水会让数值更难比较。应使用克制色板、足够对比度和冗余系列线索。如果导出契约包含透明背景,还要测试浅色与深色环境。
把职责分开:
1. 数据准备层验证并聚合观测。
2. 绘图函数接收 ax 与已准备数据,返回重要 Artist。
3. 组合层创建 Figure、布局、共享图例与图注。
4. 导出层决定格式、尺寸、DPI、背景与目标位置。
例如:
def draw_monthly_sales(ax, data):
line, = ax.plot(
data["month"],
data["sales"],
marker="o",
label="销售额",
)
ax.set(
title="每月销售额",
xlabel="月份",
ylabel="销售额(元)",
)
return {"line": line}函数不调用 show、savefig,也不创建 Figure,所以它可以进入报告、仪表板、notebook 或测试。
为真实目标导出
SVG 和 PDF 会保留矢量文字与几何,适合包含线条和标签的报告。PNG 是栅格输出,像素尺寸近似满足
宽 7.5 英寸的 Figure 以 160 DPI 保存时,在紧边界调整前约有 1,200 像素宽:
fig.savefig(
"monthly-sales.svg",
bbox_inches="tight",
)
fig.savefig(
"monthly-sales.png",
dpi=160,
bbox_inches="tight",
facecolor="white",
)
plt.close(fig)更高 DPI 会增加像素和文件大小,却不能修复原本太小或已裁切的标签。必须按最终放置尺寸检查成品,验证字体、数学符号、中英文长标签、线条可见性、图例是否包含、背景与颜色行为。
为了无障碍阅读,重要导出图还应配一段简洁文字摘要或数据表。替代文本应说明图的目的和主要模式,而不是逐一罗列装饰细节。
本章建立了一条视觉证据管线:选择忠实编码,在显式 Axes 上绘制,公开尺度与不确定性,组合可读布局,并有意识地导出。第 8 章会把同样纪律用于机器学习实验,其中数据边界和评估设计与模型本身同样重要。