You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:42:21