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

Matplotlib:如何让matshow列下方的色条宽度匹配图像宽度

问题描述

我有一列matshow图像,想要在最下方的图像下方放置一个宽度与图像一致的色条。参考相关方案实现时,会导致最下方的图像被压缩。

原测试代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
fig, axes = plt.subplots(nrows=2, ncols=1, dpi=200)

for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
    
divider = make_axes_locatable(axes[1])
cax = divider.append_axes("bottom", size="5%", pad=0.25)    

fig.colorbar(im, orientation='horizontal', cax=cax)

plt.show()

问题效果

下方图像被压缩

解决方案

方法一:提前预留色条空间

通过gridspec_kw定义子图高度比例,给底部色条单独留出位置,避免分割原图像轴导致压缩:

import numpy as np
import matplotlib.pyplot as plt

# 设定两个子图高度一致,后续手动给色条留空间
fig, axes = plt.subplots(nrows=2, ncols=1, dpi=200, gridspec_kw={'height_ratios': [1, 1]})

im = None
for ax in axes.flat:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

# 获取最下方子图的位置参数,计算色条的位置和尺寸
ax_pos = axes[1].get_position()
cax = fig.add_axes([ax_pos.x0, ax_pos.y0 - 0.06, ax_pos.width, 0.03])

fig.colorbar(im, orientation='horizontal', cax=cax)

plt.show()

方法二:用ImageGrid统一布局

使用ImageGrid可以自动管理子图和色条的布局,直接让色条匹配图像宽度,无需手动调整:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid

fig = plt.figure(dpi=200)
# 创建网格布局,指定色条在底部,尺寸和间距
grid = ImageGrid(fig, 111,
                 nrows_ncols=(2, 1),
                 axes_pad=0.3,
                 cbar_mode='single',
                 cbar_location='bottom',
                 cbar_pad=0.25,
                 cbar_size='5%')

# 绘制所有图像
for ax in grid:
    im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)

# 绑定色条到网格
grid.cbar_axes[0].colorbar(im)

plt.show()

两种方法对比

  • 方法一灵活性高,适合已有子图布局的场景,手动控制色条位置更精准;
  • 方法二代码更简洁,自动处理布局和宽度匹配,无需计算坐标,适合新建布局的情况。

内容的提问来源于stack exchange,提问作者Eduard Tetzlaff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:19:59