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
相关产品推荐
相关产品推荐

