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

Matplotlib子图中共享水平颜色条与底部轴对齐问题

解决Matplotlib多子图共享水平颜色条的定位问题

我完全懂你这种困扰——给3行1列的子图加共享水平色条时,手动用add_axes()计算位置实在太麻烦,还容易出错。其实Matplotlib有更省心的方法,不用自己硬凑坐标轴位置,给你分享两种靠谱的方案:

方案1:用Gridspec预留色条位置

提前通过gridspec_kw给色条留好专门的区域,这样色条的位置和子图完美对齐,不会乱飘。示例代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 生成测试数据
im = np.random.rand(512, 512)

# 创建子图时预留色条位置,height_ratios控制每行高度比例
fig, axs = plt.subplots(3, 1, figsize=(4, 9), gridspec_kw={'height_ratios': [1, 1, 1, 0.05]})
# 移除最后一个用于放色条的坐标轴的边框
axs[-1].axis('off')

# 绘制三个子图,收集imshow返回的对象
ims = []
for ax in axs[:-1]:
    im_obj = ax.imshow(im, cmap='viridis')
    ims.append(im_obj)

# 在预留的位置添加水平色条
fig.colorbar(ims[0], cax=axs[-1], orientation='horizontal')

plt.tight_layout()
plt.show()

方案2:让Matplotlib自动调整布局

直接用fig.colorbar()的ax参数指定所有子图,它会自动在子图下方创建共享色条,还会自动调整子图间距,完全不用手动计算位置:

import numpy as np
import matplotlib.pyplot as plt

im = np.random.rand(512, 512)
fig, axs = plt.subplots(3, 1, figsize=(4, 9))

ims = []
for ax in axs:
    im_obj = ax.imshow(im, cmap='viridis')
    ims.append(im_obj)

# 给所有子图添加共享水平色条,shrink控制色条长度,pad控制和子图的间距
fig.colorbar(ims[0], ax=axs, orientation='horizontal', shrink=0.8, pad=0.05)

plt.show()

这两种方法都比手动用add_axes()靠谱得多,尤其是第二种,几乎不用操心位置的问题,Matplotlib会帮你搞定所有布局细节。

内容的提问来源于stack exchange,提问作者Wall-E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:20:05