如何快速创建直方图网格并精简Python可视化冗余绘图代码
Seaborn直方图网格代码精简方案
核心优化逻辑
- 消除逐行手写
histplot调用、逐行移除子图图例的冗余代码,通过循环批量完成绘图操作 - 仅需维护待绘制特征列表、子图网格参数即可快速调整绘图内容,无需改动核心绘图逻辑
- 修正原代码中冗余收集12个图例句柄的问题:所有子图的分组图例完全一致,仅需取首个绘图对象的图例句柄即可生成全局图例
优化后完整代码
import matplotlib.pyplot as plt import seaborn as sns # -------------------------- 仅需修改以下配置即可调整绘图 -------------------------- # 待绘制的特征列名列表,顺序对应子图从左到右、从上到下的排列顺序 features = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] # 子图网格行列数 n_rows, n_cols = 4, 3 # 画布尺寸 figsize = (17, 17) # 全局图例标签 legend_labels = ['d', 'f'] # 数据集 plot_data = dff_2k # 分组字段 hue_col = 'source' # -------------------------------------------------------------------------------- fig, axes = plt.subplots(n_rows, n_cols, figsize=figsize) axes = axes.flatten() # 循环批量绘制直方图、移除子图本地图例 plot_handle = None for ax, feat in zip(axes, features): hist = sns.histplot(ax=ax, x=feat, hue=hue_col, data=plot_data) # 移除当前子图的图例,增加存在性判断避免无图例时报错 if ax.get_legend(): ax.get_legend().remove() # 保存第一个绘图对象的句柄用于生成全局图例 if plot_handle is None: plot_handle = hist # 添加全局统一图例 fig.legend(handles=plot_handle.legend_.legendHandles, labels=legend_labels, loc='upper right') plt.tight_layout() # 可选,自动调整子图间距避免标签重叠 plt.show()
使用说明
- 调整绘制内容时,仅需修改配置区的
features列表即可自动适配子图绘制,注意保证n_rows * n_cols的数值和features列表长度相等 - 原代码中
hue=dff_2k['source']的传参方式优化为直接传入列名hue='source',和Seaborn的参数规范保持一致,避免数据集切片带来的潜在索引匹配问题
内容的提问来源于stack exchange,提问作者Sushil Kokil
相关产品推荐
相关产品推荐

