如何调整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
相关产品推荐
相关产品推荐

