从问题到图表
本节目标
把模糊的“画一下数据”改写为可验证的问题,识别观察单元、变量类型、样本量与读者行动,并据此选择图型而不是先选库函数。
先写问题和行动
“画一下 Agent 数据”没有验收标准。改成:“比较 v1 与 v2 在退款、技术、账号三类任务上的成功率,决定是否全量发布。”问题决定需要版本、任务类、成功标记、样本数和不确定性。
先写一句可反驳的图表主张,例如“v2 在同一冻结任务集上总体成功率更高,但技术类没有改善”。随后记录:每个点/每个计数代表什么、观察是否独立、分母是否一致、失败与缺失是否被保留。若这些问题答不上来,先回到数据清洗与实验设计,而不是开始调颜色。
四步选择框架
- 问题:分布、比较、关系、时间变化、组成还是流程?
- 数据单元:每个点是一条运行、一天汇总还是一个模型版本?
- 视觉编码:位置和长度通常比面积、角度、3D 体积更易精确比较。
- 行动:读者看完要选择版本、调查异常还是调整阈值?
| 问题 | 首选起点 | 需要警惕 |
|---|---|---|
| 一个变量的分布 | histogram / ECDF / boxplot | 分箱与长尾 |
| 类别间数值比较 | 点图或条形图 | 类别排序、零基线 |
| 两数值关系 | scatter | 过度重叠、共同原因 |
| 时间变化 | line | 时间粒度、缺失区间 |
| 分类错误 | confusion matrix | 绝对数与归一化分母 |
| 两指标权衡 | scatter + 标签 | 隐藏的第三变量 |
少量精确数字用表格往往更好;图适合模式、差异和异常。
样本量也会改变选择:每组少于 10 个观察时优先直接显示每个点;10~30 个观察可用箱线/小提琴但应叠加原始点;大量散点要用透明度、hexbin 或分层抽样。类别超过约 6 个、图例难以记忆或一张图承担多个主张时,应拆成 small multiples 或多张图。
Figure、Axes 和数据
Matplotlib 中 Figure 是整张画布,Axes 是带坐标系的一个面板。推荐显式写法:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot([1, 2, 3], [120, 150, 210], marker="o")
ax.set(title="Agent latency", xlabel="Run", ylabel="Latency (ms)")
fig.tight_layout()显式 ax 比依赖当前全局图更适合多面板与可测试代码。
figsize 的单位是英寸,字号是点(pt)。先确定最终显示尺寸再绘图,避免在 Word、PPT 或网页中大幅缩放后文字不可读。脚本化导出应使用 Agg 等非交互 backend;线条、文字和点图优先保留 SVG/PDF 矢量版本,同时生成 PNG 供快速预览。
练习
为三个问题各选一张图并说明分母:不同工具的错误率;一周 p95 延迟变化;成本与任务成功率权衡。
再做一次反向检查:如果把图换成表格、改变合理分箱或按任务类型分层,你的结论是否仍成立?若结论只在某一种视觉参数下成立,不能把它当稳健证据。
掌握检查
- 我能用一句话写出图要回答的问题和读者看完后的行动。
- 我能说明每个点、每根线或每个矩阵单元的观察单元与分母。
- 我会根据变量类型、样本量和论证目标给出首选图与至少一个备选。
- 我知道何时用表格、何时拆图,以及为什么不使用饼图、3D 图或双 Y 轴。
- 我会在最终尺寸下设置
Figure,并使用显式AxesAPI。
下一步:分布与分组比较。
参考资料
资料核验日期:2026-07-14;接口示例按 Matplotlib 3.11.0 官方文档核对。