可视化进阶:多图与样式
本教程共 54 篇 · 第 52 篇 · 更新于 2026-08-11 · 约 7 分钟阅读
本节目标:掌握直方图、箱线图、散点图、面积图等常用图形,学会子图布局和样式设置,认识 pandas.plotting 的专用图形。
直方图:看分布
直方图(hist)把数值切成若干区间,数每个区间有多少个值——回答”数据集中在哪、怎么分布”:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({
"A": np.random.randn(1000) + 1,
"B": np.random.randn(1000),
})
df.plot.hist(alpha=0.5, bins=30) # alpha 半透明,bins 区间数
plt.show()
# 每列一张小图
df.hist(bins=30, figsize=(8, 3))
plt.show()
df.plot.hist() 把所有列叠在一张图上(半透明方便对比);DataFrame.hist() 是独立接口,自动给每列开一张小图。plot.hist(by="列名") 可以按类别分组画。想看平滑版的分布,用 plot.kde()(核密度估计),曲线比柱子更直观。
Tip直方图的两个参数最常用:
bins控制区间数量,太少看不清形状,太多全是毛刺,从 20-30 起步试;cumulative=True画累积分布,回答”小于某个值的数据占多少比例”。
箱线图:看离群
箱线图(boxplot)浓缩五个数字:最小值、下四分位、中位数、上四分位、最大值,箱子外的点是离群值。一眼看出”哪列波动大、有没有异常”:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(200, 4), columns=["A", "B", "C", "D"])
df.plot.box()
plt.show()
# 按分组变量画:每个组一根箱线
df2 = pd.DataFrame(np.random.randn(100, 2), columns=["数值1", "数值2"])
df2["组"] = np.random.choice(["甲", "乙"], 100)
df2.boxplot(by="组")
plt.show()
df.plot.box() 一列一根箱线,df.boxplot(by="组") 按分组各画一根。箱线图是”先扫一眼有没有异常”的利器,数据量大时比 describe() 更直观。
Tip箱线图里的”点”是离群值而不是数据全部。发现离群点后,回到数据里看是录入错误还是真实值,别急着删。
散点图与气泡图
散点图(scatter)看两个数值列的关系。x、y 指定坐标列,c 用另一列上色,s 控制点的大小:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(100, 3), columns=["x", "y", "z"])
df.plot.scatter(x="x", y="y", c="z", cmap="viridis", s=50)
plt.show()
# 气泡图:s 传一列,点的大小代表数值
df.plot.scatter(x="x", y="y", s=df["z"] * 200)
plt.show()
点太多糊成一团时,改用 hexbin(六边形分箱):df.plot.hexbin(x="x", y="y", gridsize=20),颜色深浅表示该区域的密度,百万行数据也不怕。
面积图与饼图
面积图(area)适合”总量随时间变化、还想看各部分贡献”:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 3), columns=["A", "B", "C"])
df.plot.area() # 默认堆叠
plt.show()
df.plot.area(stacked=False) # 不堆叠
plt.show()
面积图默认堆叠,各列相加就是总量;数据含 NaN 时会按 0 填充,想用别的策略先 fillna。
饼图(pie)适合展示占比,类别别超过五六个,多了人眼分不清:
import pandas as pd
import matplotlib.pyplot as plt
s = pd.Series([30, 25, 20, 15, 10], index=["A", "B", "C", "D", "E"], name="占比")
s.plot.pie(figsize=(6, 6), autopct="%.1f%%")
plt.show()
饼图最好用正方形画布(figsize 宽高相等),autopct 显示百分比。注意:饼图里标签参数叫 labels、颜色参数叫 colors,和其他图不一样——这是为了对齐 matplotlib 的 pie 接口。
子图布局
一个图里放多个坐标系(axes)。两种方式:
方式一:plot 自带 subplots 参数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(50, 4), columns=list("ABCD"))
df.plot(subplots=True, layout=(2, 2), figsize=(8, 6))
plt.show()
方式二:plt.subplots 先建画布,再往每个坐标系里画
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(50, 2), columns=["x", "y"])
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
df.plot(ax=axes[0]) # 左:线图
df.plot.scatter(x="x", y="y", ax=axes[1]) # 右:散点
plt.tight_layout() # 自动拉开间距
plt.show()
方式二更灵活:不同子图可以画不同类型的图,还能把 ax 传给任何 pandas 绘图方法。layout 里可以用 -1 让 pandas 自动算行列,比如 layout=(2, -1)。
样式与细节
- 风格:
plt.style.use("ggplot")一键换肤。plt.style.available列出所有可选风格,seaborn 系列最常用,写在脚本开头即可。 - 图例:默认自动显示,
legend=False关掉。 - 轴标签:
xlabel、ylabel参数直接改。 - 对数轴:
logy=True(或 logx、loglog),数据跨数量级时必备。 - 双 y 轴:
df.plot(secondary_y=["B"]),让两个量级差很大的列共图,图例自动标注 “(right)”。 - 配色:列多时
colormap="viridis"让颜色有梯度,避免默认循环色分不清:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 6), columns=list("ABCDEF"))
df.plot.bar(colormap="viridis")
plt.show()
pandas.plotting:专业图形工具箱
pandas.plotting 模块提供一组”开箱即用”的专用图,接收 Series/DataFrame 直接画:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix, autocorrelation_plot
df = pd.DataFrame(np.random.randn(1000, 4), columns=["a", "b", "c", "d"])
scatter_matrix(df, alpha=0.2, figsize=(8, 8), diagonal="kde")
plt.show()
s = pd.Series(np.random.randn(1000))
autocorrelation_plot(s)
plt.show()
常用成员一句话:scatter_matrix 多列两两散点(对角线是分布)、lag_plot 检查数据随机性、autocorrelation_plot 自相关图(时间序列建模前必看)、parallel_coordinates 平行坐标(多变量聚类可视化)、radviz 雷达状多变量图、bootstrap_plot 统计量不确定性、andrews_curves 傅里叶曲线聚类。用到时按名查文档即可。
Note这些图大多是”探索性分析”工具:分析阶段用它们快速找规律,正式汇报时再用 matplotlib/seaborn 精修。
小结
直方图看分布、箱线图找离群、散点图看关系、面积图看构成,加上子图与样式,pandas 内置绘图已经能覆盖日常 80% 的探索需求。画不出来或要更漂亮的图时,seaborn 是 pandas 数据的最佳搭档。下一节换赛道:数据大了,怎么让 pandas 跑得更快。