如何将for循环生成的多个堆叠条形图绘制到同一画布子图网格中
多堆叠条形图统一网格排布实现
直接替换原有代码即可实现4行3列的子图布局,核心逻辑是提前创建子图网格,将每个图表绑定到对应位置的轴对象上渲染:
import matplotlib.pyplot as plt import matplotlib.ticker as mtick # 全局画布尺寸适配4行3列布局,可根据显示效果微调宽高 plt.rcParams["figure.figsize"] = (18, 16) # 创建4行3列的子图网格 fig, axes = plt.subplots(nrows=4, ncols=3) # 将二维轴数组展平为一维,方便循环按顺序匹配图表 axes = axes.flatten() for idx, key in enumerate(d): current_ax = axes[idx] # 绘图时指定ax参数,将图表渲染到对应子图位置 d[key].plot( kind = 'barh', width= 0.85, stacked = True, color = ['limegold', 'orange', 'red'], ax = current_ax ) # 针对当前子图做格式设置 current_ax.legend(bbox_to_anchor = (1.05, 1.025), title = "Categories") current_ax.set_xlabel('Cumulative Percent') current_ax.xaxis.set_major_formatter(mtick.PercentFormatter()) current_ax.set_ylabel('Data Stream') current_ax.invert_yaxis() current_ax.set_title(f'{key}') # 隐藏网格中未使用的空白子图(当DataFrame总数小于12时生效) for empty_ax_idx in range(idx + 1, len(axes)): axes[empty_ax_idx].axis('off') # 自动调整子图间距,避免标题、标签、图例重叠遮挡 plt.tight_layout() plt.show()
核心修改说明
- 移除循环内的单图尺寸设置,提前创建指定行列数的子图网格,全局设置适配多图排布的画布大小
- 给pandas的
plot()方法传入ax参数,明确指定每个DataFrame的图表绘制到哪个子图位置,避免Notebook逐行输出独立图表 - 所有坐标轴格式、图例、标题设置,全部针对当前子图对应的轴对象操作,避免全局绘图接口的渲染冲突
- 自动隐藏多出来的空白子图,不会出现无内容的空框
- 调用
tight_layout()自动适配子图间距,不需要手动微调边距 - 如果字典内DataFrame数量不是12,对应修改
plt.subplots()的nrows、ncols参数,保证网格总格子数不小于DataFrame总数即可
内容的提问来源于stack exchange,提问作者Jasper_97
相关产品推荐
相关产品推荐

