跳转至

数据科学 3 · 可视化

数据分析的最后一环是——把数字变成图。Python 的 matplotlib 是事实标准(Pandas、seaborn 都基于它)。本章讲常用图表(折线/柱状/散点/子图)和保存 PNG。

uv add matplotlib        # 或 pip install matplotlib

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.pysavefig 生成——标题用英文,以兼容无中文字体的环境;你跑上文中文标题的代码前需先按本节配好字体。


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

参考答案
import numpy as np, matplotlib.pyplot as plt
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("三角函数")
plt.savefig("trig.png", dpi=100)
练习 3.2

用 Pandas 读 CSV,按地区分组求销售额总和,画柱状图保存。

参考答案
import pandas as pd, matplotlib.pyplot as plt
df = pd.read_csv("sales.csv")
s = df.groupby("region")["amount"].sum()
fig, ax = plt.subplots(); ax.bar(s.index, s.values)
ax.set_title("各区域销售额"); plt.savefig("sales_by_region.png")
练习 3.3

解释 FigureAxes 的区别,为什么多子图要用面向对象 API。

参考答案

Figure 是整张画布,Axes 是其中一个带坐标轴的子图区域(一个 Figure 可含多个 Axes)。多子图时,面向对象 API(fig, axes = plt.subplots(...))能明确操作每个 axes[i];全局 pyplot API 只适合单图,多图会混乱。


上一章:数据科学 2 · Pandas← 回首页核心教程路线图