从问题到图表

本节目标

把模糊的“画一下数据”改写为可验证的问题,识别观察单元、变量类型、样本量与读者行动,并据此选择图型而不是先选库函数。

先写问题和行动

“画一下 Agent 数据”没有验收标准。改成:“比较 v1 与 v2 在退款、技术、账号三类任务上的成功率,决定是否全量发布。”问题决定需要版本、任务类、成功标记、样本数和不确定性。

先写一句可反驳的图表主张,例如“v2 在同一冻结任务集上总体成功率更高,但技术类没有改善”。随后记录:每个点/每个计数代表什么、观察是否独立、分母是否一致、失败与缺失是否被保留。若这些问题答不上来,先回到数据清洗与实验设计,而不是开始调颜色。

四步选择框架

  1. 问题:分布、比较、关系、时间变化、组成还是流程?
  2. 数据单元:每个点是一条运行、一天汇总还是一个模型版本?
  3. 视觉编码:位置和长度通常比面积、角度、3D 体积更易精确比较。
  4. 行动:读者看完要选择版本、调查异常还是调整阈值?
问题首选起点需要警惕
一个变量的分布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,并使用显式 Axes API。

下一步:分布与分组比较。

参考资料

资料核验日期:2026-07-14;接口示例按 Matplotlib 3.11.0 官方文档核对。