如何用Pandas为DataFrame的35个特征绘制小多图?
如何为35个特征批量绘制小多图(Small Multiple Chart)
嘿,我来帮你搞定批量绘制小多图的问题!35个特征一个个画确实太麻烦,直接用matplotlib的子图网格+遍历就能一次性搞定,给你完整方案和拆解:
完整代码示例
import matplotlib.pyplot as plt import pandas as pd # 1. 读入数据集到DataFrame df = pd.read_csv("mydataset.csv") # 2. 规划子图布局:35个特征刚好7行5列(也可以换成5行7列,看你偏好) n_rows = 7 n_cols = 5 # 创建画布和子图网格,调整figsize让每个子图有足够空间 fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 20)) # 3. 遍历每个特征,在对应子图绘制 for idx, (feature_name, ax) in enumerate(zip(df.columns, axes.flatten())): # 在当前子图绘制特征折线图(如果要换直方图,把plot()改成plot(kind='hist')即可) df[feature_name].plot(ax=ax, title=f"Feature: {feature_name}") # 优化细节:去掉x轴标签避免拥挤,缩小刻度字体 ax.set_xlabel("") ax.tick_params(axis='x', labelsize=8) # 4. 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() # 渲染显示图表,或者保存成图片 plt.show() # plt.savefig("small_multiples.png", dpi=300) # 按需取消注释保存
关键步骤拆解
- 读入数据:这一步你已经写对了,
pd.read_csv()完美加载数据集到DataFrame。 - 布局规划:35个特征刚好能分成7×5的网格(刚好35个位置),
plt.subplots()会一次性生成所有子图的坐标轴,figsize参数要根据布局调整,保证每个子图不会挤成一团。 - 遍历绘图:
axes.flatten()把二维的子图数组转成一维列表,这样就能和df.columns一一对应遍历。每个子图通过ax参数指定绘图位置,加上标题方便区分不同特征。 - 布局优化:
plt.tight_layout()是神器,会自动调整子图的间距,避免标题、刻度互相重叠;你还可以根据需求调整刻度字体大小、隐藏不必要的标签,让图表更清爽。 - 渲染保存:
plt.show()直接显示图表,也可以用plt.savefig()导出高清图片。
可选优化建议
- 按需切换图表类型:如果特征是分类数据,把
df[feature_name].plot()改成df[feature_name].plot(kind='bar')就能画柱状图;数值型数据也可以用直方图kind='hist'。 - 共享坐标轴:如果特征的数值范围相近,可以在
plt.subplots()里加sharex=True或sharey=True,让子图共享坐标轴,减少重复标签,布局更整洁。 - 调整布局比例:如果觉得7行5列纵向太长,换成5行7列横向布局也是可以的,只要行数×列数≥35就行(多出来的子图可以用
ax.remove()删掉)。
内容的提问来源于stack exchange,提问作者docdev




