问题与目标
汇总表能给出精确数字,却不容易暴露偏态、异常值、群组差异和趋势。可视化的任务是验证问题,不是装饰报告。
完成标准:能根据变量类型选择图表,使用 Matplotlib 控制画布和标签,用 Seaborn 绘制分布与关系,并把图片保存为可复查文件。

左图检查单个变量的分布形态,右图观察两个变量之间的关系。示例图由配套脚本生成,用来说明图表应服务于具体问题,而不是把同一份数据换几种样式重复展示。
核心概念
| 问题 | 合适图表 |
|---|---|
| 单个连续变量如何分布 | 直方图、箱线图 |
| 类别之间数量或指标差异 | 条形图、箱线图 |
| 两个连续变量是否相关 | 散点图 |
| 指标是否随时间变化 | 折线图 |
| 多个数值变量线性相关 | 相关性热力图 |
Matplotlib 提供底层画布、坐标轴和保存控制;Seaborn 基于它提供面向统计数据的高级接口。相关性只表示共同变化,不证明因果。坐标轴范围、聚合方式和样本数量都会影响解读。
画图前先写问题
同一数据可以画出许多图,但每张图应只回答一个主要问题:
- “典型值和尾部在哪里”需要分布图,而不是只看均值。
- “两个变量是否共同变化”需要散点图,并关注非线性和离群点。
- “不同类别是否有差异”除了均值条形图,还应展示样本量和分布。
- “时间是否变化”需要稳定时间粒度和连续时间轴。
箱线图中的箱体表示四分位范围,须明确“箱外点”只是统计标记,不自动等于错误数据。直方图结论会受分箱数量影响,可以对比多个 bins 或补充核密度估计。
面向对象接口
推荐显式持有 figure 和 axes,方便多图布局和测试:
import matplotlib.pyplot as plt
figure, axis = plt.subplots(figsize=(6, 4))
axis.plot([1, 2, 3], [2, 5, 4], marker="o", label="daily value")
axis.set(title="Daily metric", xlabel="Day", ylabel="Value")
axis.legend()
axis.grid(alpha=0.3)
figure.tight_layout()
figure.savefig("daily_metric.png", dpi=150, bbox_inches="tight")
plt.close(figure)
关闭画布能防止批量绘图时内存持续增长。保存格式取决于用途:PNG 适合普通展示,SVG/PDF 适合需要缩放的矢量图。
颜色与坐标轴也会影响判断
类别颜色应稳定且可区分,连续数值使用顺序色带,正负相关可使用发散色带。截断纵轴可能夸大差异,对数坐标适合跨数量级数据,但必须明确标注。三维图和双纵轴通常增加解读负担,应有明确必要性。
可运行实现
代码在无桌面服务器上也能保存图片:
python -m pip install matplotlib seaborn pandas
from pathlib import Path
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
data = pd.DataFrame(
{
"group": ["A"] * 5 + ["B"] * 5,
"hours": [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
"score": [52, 58, 63, 70, 76, 48, 55, 61, 80, 95],
}
)
sns.set_theme(style="whitegrid")
figure, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.histplot(data=data, x="score", hue="group", bins=6, ax=axes[0])
axes[0].set(title="Score distribution", xlabel="Score", ylabel="Count")
sns.scatterplot(data=data, x="hours", y="score", hue="group", ax=axes[1])
axes[1].set(title="Hours and score", xlabel="Hours", ylabel="Score")
figure.tight_layout()
output = Path("output/exploration.png")
output.parent.mkdir(parents=True, exist_ok=True)
figure.savefig(output, dpi=150, bbox_inches="tight")
plt.close(figure)
print(output.resolve())
输入是组别、学习时长和得分,输出为 output/exploration.png。第一张图检查分布,第二张图观察关系和组间差异。样本很少,只能用于演示,不能据此形成稳定业务结论。
发布前检查标题、单位、图例、样本范围、聚合方式和数据来源。图应能在没有口头解释时被正确理解,同时保留生成图表的代码和汇总数据。
进一步验证
- 为分布图补充每组样本数,并比较直方图和箱线图分别显示了什么。
- 向数据加入一个极端值,观察散点图坐标范围和相关性的变化。
- 生成一张按周汇总的趋势图,在标题或图注中写明汇总口径。
- 关闭图形后从文件路径重新打开,检查标题、单位和图例在脱离上下文时是否仍清楚。
结果判断不以“图好看”为标准,而是读者能正确回答样本是谁、横纵轴是什么、数据是否经过聚合。
常见问题与排查
- 服务器报显示后端错误:设置非交互后端并使用
savefig。 - 中文显示为方框:安装并显式配置可用字体,不要假设所有机器都有某个中文字体。
- 类别太多导致标签重叠:排序后只展示重点类别,完整结果保留在表格。
- 双纵轴制造误导:若量纲不同,优先拆图或标准化,并明确单位。
- 热力图颜色很强就说关系重要:同时查看数值、样本量、异常值和业务机制。
小结
好图表从问题出发:看分布、比类别、找关系或看趋势。标题、单位、样本范围和聚合规则必须明确,图片还应保存到固定路径以便复查。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


