共享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() 精调标签位置,确保刻度与标签对齐。
不同子图若使用各自的数据范围,colorbar 刻度会不一致,导致“共享”失效。必须用同一个 Normalize 实例或固定 vmin/:
matplotlib.colors.Normalize(vmin=..., vmax=...) 显式定义,传给每个 imshow() 的 norm 参数vmin/vmax 关键字(虽可用),因在多子图中易遗漏或不一致min/max,再构造统一 norm不要对每个子图单独调用 plt.colorbar(),而应绘制完所有子图后,用 fig.colorbar(mappable, ax=axes_list) 绑定到全部子图轴:
mappable 可取任一子图的 imshow 返回对象(因 norm 已统一,内容等价)ax=axes_list 传入所有子图的 axes 数组(如 [ax1, ax2, ax3]),colorbar 会自动适配布局并留出空间shrink=0.8 或 aspect=20 微调长度/宽高比,避免过长或过短默认 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 控制旋转角度与间距y = 0.05;顶部对齐用 y = 0.95
以下代码实现 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()