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

如何让Matplotlib中Colorbar尺寸匹配子图?新手求统一色条方案

为Matplotlib多子图添加匹配尺寸的统一色条

核心思路

给4张子图加统一色条,关键要做到两点:

  • 所有子图使用相同的颜色范围(vmin/vmax),保证色条能对应所有子图的数据
  • 让色条的高度和子图整体高度完全匹配,避免尺寸错位

新手友好的实现代码

下面是完整可运行的示例,代码里加了详细注释,你可以直接替换自己的数据:

import matplotlib.pyplot as plt
import numpy as np

# 1. 创建2行2列的子图布局,右侧预留色条位置
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
# 调整子图间距,给色条留出空间
fig.subplots_adjust(right=0.85)

# 2. 生成示例数据(替换成你自己的数据即可)
data1 = np.random.rand(10, 10) * 5
data2 = np.random.rand(10, 10) * 5
data3 = np.random.rand(10, 10) * 5
data4 = np.random.rand(10, 10) * 5

# 3. 统一颜色范围(所有子图共用这个范围,保证色条统一)
vmin = 0
vmax = 5

# 4. 绘制4张子图,指定相同的cmap和颜色范围
im1 = axes[0,0].imshow(data1, cmap='viridis', vmin=vmin, vmax=vmax)
axes[0,0].set_title('子图1')
im2 = axes[0,1].imshow(data2, cmap='viridis', vmin=vmin, vmax=vmax)
axes[0,1].set_title('子图2')
im3 = axes[1,0].imshow(data3, cmap='viridis', vmin=vmin, vmax=vmax)
axes[1,0].set_title('子图3')
im4 = axes[1,1].imshow(data4, cmap='viridis', vmin=vmin, vmax=vmax)
axes[1,1].set_title('子图4')

# 5. 创建匹配高度的统一色条
# 用fig.add_axes手动指定色条位置,参数是[左, 下, 宽, 高],这里和子图高度对齐
cbar_ax = fig.add_axes([0.88, 0.15, 0.03, 0.7])
fig.colorbar(im1, cax=cbar_ax)

plt.show()

关键细节解释

  • fig.subplots_adjust(right=0.85):把右侧的留白扩大,给色条腾位置
  • vmin/vmax:强制所有子图用相同的颜色刻度,这样色条能正确对应所有子图的数据
  • fig.add_axes([0.88, 0.15, 0.03, 0.7]):手动控制色条的位置和尺寸,四个参数分别是:
    • 左边缘距离画布左侧的比例(0-1)
    • 下边缘距离画布底部的比例(0-1)
    • 色条的宽度比例
    • 色条的高度比例
      你可以调整这些数值,让色条和子图完美对齐

另一种更灵活的方法(自动匹配高度)

如果不想手动计算位置比例,可以用mpl_toolkits.axes_grid1里的工具,自动匹配子图高度:

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

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
vmin, vmax = 0, 5

# 绘制子图
im_list = []
for i, ax in enumerate(axes.flat):
    data = np.random.rand(10,10)*5
    im = ax.imshow(data, cmap='viridis', vmin=vmin, vmax=vmax)
    ax.set_title(f'子图{i+1}')
    im_list.append(im)

# 为最后一个子图创建色条容器,高度和子图一致
divider = make_axes_locatable(axes[1,1])
cax = divider.append_axes("right", size="5%", pad=0.1)
fig.colorbar(im_list[0], cax=cax)

plt.tight_layout()
plt.show()

这种方法不需要手动计算位置,适合子图布局变化的情况。

内容的提问来源于stack exchange,提问作者Nouredin Modl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:01:44