数据科学 3 · 可视化¶
数据分析的最后一环是看——把数字变成图。Python 的 matplotlib 是事实标准(Pandas、seaborn 都基于它)。本章讲常用图表(折线/柱状/散点/子图)和保存 PNG。
matplotlib 同样无 Java 对应(Java 画图要么手写 AWT/Swing,要么靠 JFreeChart 等老库)。这是 Python 数据科学生态的又一环。
3.1 基本流程:Figure 与 Axes¶
matplotlib 的核心对象:
Figure:整张画布。Axes:一个子图(坐标轴 + 数据),不是"轴"。
import matplotlib.pyplot as plt
fig, ax = plt.subplots() # 创建画布 + 一个子图
ax.plot([1, 2, 3], [1, 4, 9]) # 画数据
ax.set_title("示例折线")
ax.set_xlabel("x"); ax.set_ylabel("y")
plt.savefig("line.png", dpi=100, bbox_inches="tight") # 保存 PNG
plt.show() # 交互式弹窗(脚本里)
两种 API
- 面向对象(
fig, ax = plt.subplots(); ax.plot(...)):推荐,灵活、多子图清晰。 - pyplot 全局(
plt.plot(...)):简单快速,单图够用。
3.2 折线图¶
import numpy as np
x = np.linspace(0, 2*np.pi, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin")
ax.plot(x, np.cos(x), label="cos")
ax.legend(); ax.set_title("三角函数")

3.3 柱状图¶
regions = ["north", "south", "east", "west"]
amounts = [120, 85, 200, 150]
fig, ax = plt.subplots()
ax.bar(regions, amounts)
ax.set_title("各区域销售额")

3.4 散点图¶
观察两个变量的关系:
x = np.random.rand(50) * 10
y = x * 2 + np.random.randn(50) * 2
fig, ax = plt.subplots()
ax.scatter(x, y)
ax.set_xlabel("x"); ax.set_ylabel("y"); ax.set_title("散点关系")

3.5 子图¶
一张画布放多个图:
fig, axes = plt.subplots(1, 2, figsize=(10, 4)) # 1 行 2 列
axes[0].plot(x, np.sin(x)); axes[0].set_title("sin")
axes[1].plot(x, np.cos(x)); axes[1].set_title("cos")
fig.tight_layout() # 自动调整间距

3.6 与 Pandas 集成(df.plot)¶
Pandas 内置绘图(底层 matplotlib),几行出图:
import pandas as pd
df = pd.read_csv("sales.csv")
df.groupby("region")["amount"].sum().plot(kind="bar") # 分组求和直接画柱状
df["amount"].hist() # 直方图
df.plot(x="date", y="amount", kind="line") # 折线
3.7 中文与样式¶
matplotlib 默认字体不含中文,标题会显示方框。配中文字体:
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Noto Sans CJK SC"]
plt.rcParams["axes.unicode_minus"] = False # 负号正常显示
保存而非显示
脚本/服务器里用 plt.savefig("x.png") 存图;plt.show() 是交互弹窗(Jupyter 里自动内联)。本篇嵌入的截图由 examples/ds/viz_demo.py 用 savefig 生成——标题用英文,以兼容无中文字体的环境;你跑上文中文标题的代码前需先按本节配好字体。
3.8 可视化速查¶
| 图表 | 用途 | 代码 |
|---|---|---|
plot |
趋势/折线 | ax.plot(x, y) |
bar |
分类对比 | ax.bar(cats, vals) |
scatter |
两变量关系 | ax.scatter(x, y) |
hist |
分布 | ax.hist(data, bins=20) |
boxplot |
离群值/分布 | ax.boxplot(data) |
选图原则:看趋势用折线、对比用柱状、关系用散点、分布用直方/箱线。
本章练习¶
练习 3.1
生成 0~2π 的 x,画 sin 和 cos 在同一张折线图,加图例和标题,保存为 trig.png。
练习 3.2
用 Pandas 读 CSV,按地区分组求销售额总和,画柱状图保存。
练习 3.3
解释 Figure 与 Axes 的区别,为什么多子图要用面向对象 API。
参考答案
Figure 是整张画布,Axes 是其中一个带坐标轴的子图区域(一个 Figure 可含多个 Axes)。多子图时,面向对象 API(fig, axes = plt.subplots(...))能明确操作每个 axes[i];全局 pyplot API 只适合单图,多图会混乱。
上一章:数据科学 2 · Pandas | ← 回首页 | 核心教程路线图