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

如何调整Matplotlib子图中水平条形图的尺寸以适配饼图?

解决Matplotlib水平条形图尺寸过大问题

你的问题核心是条形图默认撑满了子图的水平空间,同时子图行高比例不合理,导致视觉上条形图尺寸过大。可以通过以下几个步骤调整:

调整子图行高比例

创建子图时,通过gridspec_kw设置每组(饼图+条形图)的行高比例,让条形图行更矮,避免垂直方向占用过多空间:

fig, axes = plt.subplots(28, 11, figsize=(16, 24), gridspec_kw={'height_ratios': [3,1]*14})

这里[3,1]*14表示每两行一组,第一行(饼图)高度是第二行(条形图)的3倍,figsize可根据你的布局需求调整整体画布大小。

控制条形图的显示范围

不要直接关闭整个轴(axis('off')),而是手动设置x轴范围,同时隐藏不需要的刻度和边框,让条形图在子图内留出空白,实现“缩小”效果:

# 绘制条形图后添加
ax_bar = axes[countery+1,counterx]
ax_bar.set_xlim(-5, 105)  # 左右留少量空白,避免条形贴边
ax_bar.set_ylim(-0.3, 0.3)  # 控制垂直方向范围,压缩条形高度
# 隐藏刻度和边框
ax_bar.set_xticks([])
ax_bar.set_yticks([])
for spine in ax_bar.spines.values():
    spine.set_visible(False)

调整条形图自身高度

修改barh的height参数,让条形更紧凑,比如从1改为0.6:

ax_bar.barh('a', 40, height=0.6)
ax_bar.barh('a', 60, left=40, height=0.6)

完整修改后的代码

import matplotlib.pyplot as plt

# 设置画布大小和行高比例
fig, axes = plt.subplots(28, 11, figsize=(16, 24), gridspec_kw={'height_ratios': [3,1]*14})

countery = 0
for y in range(14):
    counterx = 0
    for x in range(11):
        # 绘制饼图
        axes[countery, counterx].pie([70, 20])
        # 绘制条形图
        ax_bar = axes[countery+1, counterx]
        ax_bar.barh('a', 40, height=0.6)
        ax_bar.barh('a', 60, left=40, height=0.6)
        
        # 调整条形图显示范围和样式
        ax_bar.set_xlim(-5, 105)
        ax_bar.set_ylim(-0.3, 0.3)
        ax_bar.set_xticks([])
        ax_bar.set_yticks([])
        for spine in ax_bar.spines.values():
            spine.set_visible(False)
        
        counterx += 1
    countery += 2

# 调整子图间距
plt.subplots_adjust(hspace=0.3, wspace=0.1)
plt.show()

关键说明

  • gridspec_kw的行高比例是控制饼图和条形图垂直空间的核心,可根据参考图调整3和1的数值;
  • 设置xlim和ylim能精准控制条形图在子图内的显示区域,避免撑满整个子图;
  • 隐藏刻度和边框后,视觉效果和直接axis('off')一致,但保留了轴的范围控制能力。

内容的提问来源于stack exchange,提问作者Julio Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:09:23