如何用Matplotlib将Boxplot+Histogram组合图按每行2组并排展示?
需求说明
当前代码会逐个生成箱线图+直方图的组合图,所有图纵向排列需滚动查看,希望修改代码实现每行2组组合图并排展示。
原代码如下:
cols=bank_data.select_dtypes(['int64','float64']).columns for i, variable in enumerate(cols): if variable != "CLIENTNUM": f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (.15, .85)}); # Add a graph in each part sns.boxplot(bank_data[variable], ax=ax_box); sns.histplot(bank_data[variable], bins=12, kde=True, stat='density',ax=ax_hist); ax_box.axvline(np.mean(bank_data[variable]),color='g',linestyle='-') ax_hist.axvline(np.mean(bank_data[variable]),color='g',linestyle='-') ax_hist.axvline(np.median(bank_data[variable]),color='y',linestyle='--') plt.tight_layout()
修改后的代码
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 筛选数值型列并排除CLIENTNUM target_cols = [col for col in bank_data.select_dtypes(['int64', 'float64']).columns if col != "CLIENTNUM"] total_figs = len(target_cols) # 计算所需行数:每行2个组合图,向上取整 row_count = (total_figs + 1) // 2 # 创建总画布:每行包含2个组合图,每个组合图占2行(箱线图+直方图) fig, axes = plt.subplots(row_count * 2, 2, figsize=(16, 6 * row_count), gridspec_kw={"height_ratios": [0.15, 0.85] * row_count}) for idx, var in enumerate(target_cols): # 计算当前组合图在画布中的位置 base_row = (idx // 2) * 2 col_pos = idx % 2 # 获取当前组合图的两个轴对象 ax_box = axes[base_row, col_pos] ax_hist = axes[base_row + 1, col_pos] # 绘制箱线图 sns.boxplot(bank_data[var], ax=ax_box) # 绘制直方图 sns.histplot(bank_data[var], bins=12, kde=True, stat='density', ax=ax_hist) # 添加均值和中位数标记线 mean_val = np.mean(bank_data[var]) median_val = np.median(bank_data[var]) ax_box.axvline(mean_val, color='g', linestyle='-') ax_hist.axvline(mean_val, color='g', linestyle='-') ax_hist.axvline(median_val, color='y', linestyle='--') # 设置标题和轴标签 ax_box.set_title(f'{var} 分布') ax_box.set_xlabel('') # 隐藏箱线图x轴标签,和直方图共享x轴 ax_hist.set_xlabel(var) # 调整布局避免元素重叠 plt.tight_layout() plt.show()
核心改动说明
- 提前规划画布结构:先统计需要绘制的组合图数量,计算出画布的总行数(每行2个组合图),一次性创建大画布,避免循环中重复创建独立画布
- 定位子图位置:通过索引计算每个变量对应的箱线图、直方图在大画布中的坐标位置,实现按序排列
- 统一布局优化:统一设置标题、轴标签,调整画布尺寸,确保所有元素显示清晰不重叠
内容的提问来源于stack exchange,提问作者panda_newbie
相关产品推荐
相关产品推荐

