共享colorbar需统一vmin/vmax或Normalize实例,用fig.colorbar(im, ax=axes)绑定所有子图,再通过set_label_coords和rotation精调标签位置。

多个子图共享 colorbar 时,关键在于:统一 colorbar 的数据范围、用 plt.colorbar(..., ax=...) 或 fig.colorbar(...) 绑定到整个 figure,并通过 ax.tick_params() 和 cbar.ax.yaxis.set_label_coords() 精调标签位置,确保刻度与标签对齐。
统一归一化(Norm)和数据范围
不同子图若使用各自的数据范围,colorbar 刻度会不一致,导致“共享”失效。必须用同一个 Normalize 实例或固定 vmin/vmax:
- 推荐用
matplotlib.colors.Normalize(vmin=..., vmax=...)显式定义,传给每个imshow()的norm参数 - 避免直接用
vmin/vmax关键字(虽可用),因在多子图中易遗漏或不一致 - 若数据动态生成,先遍历所有子图数据求全局
min/max,再构造统一 norm
用 fig.colorbar() 创建共享 colorbar
不要对每个子图单独调用 plt.colorbar(),而应绘制完所有子图后,用 fig.colorbar(mappable, ax=axes_list) 绑定到全部子图轴:
-
mappable可取任一子图的imshow返回对象(因 norm 已统一,内容等价) -
ax=axes_list传入所有子图的 axes 数组(如[ax1, ax2, ax3]),colorbar 会自动适配布局并留出空间 - 加
shrink=0.8或aspect=20微调长度/宽高比,避免过长或过短
手动对齐 colorbar 标签与刻度
默认 label 可能偏上或偏下,尤其当子图高度不一时。用 cbar.ax.yaxis.set_label_coords(x, y) 直接设坐标(相对 colorbar 轴):
-
x = 1.1:label 放在 colorbar 右侧外;y = 0.5垂直居中(0~1 区间) - 配合
cbar.ax.yaxis.label.set_rotation(270)和labelpad=15控制旋转角度与间距 - 若需 label 底部对齐刻度,设
y = 0.05;顶部对齐用y = 0.95
完整示例(4 子图 + 右侧共享 colorbar)
以下代码实现 2×2 子图、统一 norm、右侧垂直 colorbar、标签垂直居中对齐:
import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np生成四组不同但同量级的数据
data = [np.random.rand(10,10)+i*0.2 for i in range(4)] vmin, vmax = np.min(data), np.max(data) norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
fig, axes = plt.subplots(2, 2, figsize=(6,5)) axes = axes.flatten()
for i, (ax, d) in enumerate(zip(axes, data)): im = ax.imshow(d, norm=norm, cmap='viridis') ax.set_title(f'Plot {i+1}')
共享 colorbar,绑定全部 axes
cbar = fig.colorbar(im, ax=axes, shrink=0.8, aspect=20) cbar.ax.yaxis.set_label_coords(1.1, 0.5) # 标签水平位置 1.1,垂直居中 cbar.ax.yaxis.label.set_rotation(270) cbar.ax.yaxis.label.set_label_coords(1.1, 0.5) cbar.set_label('Shared Color Scale', labelpad=15)
plt.tight_layout() plt.show()










