如何为DataFrame所有列按分组自动批量生成箱线图
批量生成箱线图的实现方案
你可以通过遍历特征列+拍平子图索引的方式实现自动化绘制,无需手动编写每一行绘图代码,两种常用实现方案如下:
方案1:单画布全量绘制
适合特征数量不多、需要将所有箱线图放在同一张图的场景:
import matplotlib.pyplot as plt import seaborn as sns import math # 提取所有待绘制的特征列,自动排除类别列classe feature_cols = [col for col in sapiens.columns if col != 'classe'] row_plot_num = 3 # 自定义每行放置的子图数量 total_row = math.ceil(len(feature_cols) / row_plot_num) # 自动计算所需总行数 # 生成画布和子图数组,根据总高度动态调整画布尺寸 fig, axes = plt.subplots(total_row, row_plot_num, figsize=(18, 4 * total_row)) axes = axes.flatten() # 将二维子图数组转为一维,无需手动计算行列坐标 fig.suptitle('SAPIENS BOXPLOTS', y=1.02) # 遍历特征自动绘制 for index, feature in enumerate(feature_cols): sns.boxplot(ax=axes[index], data=sapiens, x='classe', y=feature) axes[index].set_title(feature) # 可选:为每个子图添加特征名标题 # 自动隐藏多余的空白子图 for empty_idx in range(len(feature_cols), len(axes)): axes[empty_idx].axis('off') plt.tight_layout() # 自动调整子图间距避免重叠 plt.show()
方案2:分页绘制(更适合150个特征的场景)
单画布放置150张子图会非常拥挤,推荐分页绘制,每页固定放9张(3x3),还可以自动保存到本地:
import matplotlib.pyplot as plt import seaborn as sns feature_cols = [col for col in sapiens.columns if col != 'classe'] per_page_num = 9 # 每页放置9张子图,对应3x3布局 total_page = (len(feature_cols) + per_page_num - 1) // per_page_num # 计算总页数 for page in range(total_page): # 提取当前页对应的特征列表 start = page * per_page_num end = min(start + per_page_num, len(feature_cols)) current_features = feature_cols[start:end] # 生成当前页画布 fig, axes = plt.subplots(3, 3, figsize=(18, 12)) axes = axes.flatten() fig.suptitle(f'SAPIENS BOXPLOTS 第{page+1}页/共{total_page}页', y=1.02) # 绘制当前页所有箱线图 for idx, feature in enumerate(current_features): sns.boxplot(ax=axes[idx], data=sapiens, x='classe', y=feature) axes[idx].set_title(feature) # 隐藏空白子图 for empty_idx in range(len(current_features), len(axes)): axes[empty_idx].axis('off') plt.tight_layout() # 可选:自动保存每页图片到本地 plt.savefig(f'sapiens_boxplot_page_{page+1}.png', dpi=300, bbox_inches='tight') plt.show()
核心逻辑说明
- 先自动筛选排除类别列的所有待绘制特征,无需手动整理特征名
- 通过
axes.flatten()将二维的子图数组转为一维,直接按遍历顺序匹配子图位置,不需要手动计算[行,列]坐标 - 自动隐藏未被使用的空白子图,避免出现多余坐标轴
效果示例:
内容的提问来源于stack exchange,提问作者Vinicius PG
相关产品推荐
相关产品推荐

