Matplotlib多子图双颜色条配置咨询:两类子图需对应设置色条
在Matplotlib右侧添加两个独立通用颜色条的解决方案
当然可以!完全能在图的右侧放置两个独立的通用颜色条,分别对应你的两组子图。核心思路是手动创建额外的轴对象来放置两个色条,同时确保同组子图使用统一的刻度范围,让色条能适配该组所有子图。
实现步骤说明
- 调整子图布局:缩小
subplots_adjust的right参数,给右侧留出足够空间放置两个色条(比如设为0.75,默认是0.9)。 - 分组绘制子图:
- 第一组8张子图统一使用
jet配色,并且设置相同的vmin和vmax来固定刻度范围,保证色条通用。 - 第二组4张子图同理,使用
RdBu_r配色并统一刻度。
- 第一组8张子图统一使用
- 创建色条轴:用
fig.add_axes()手动指定色条的位置和大小(归一化坐标,范围0-1),再通过fig.colorbar()把色条绑定到对应组的子图上。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 创建4行3列的子图,调整布局留出右侧色条空间 fig, axs = plt.subplots(4, 3, figsize=(10, 12)) plt.subplots_adjust(wspace=0.5, right=0.75, top=0.9, bottom=0.1) # ---------------------- 第一组:8张子图,jet色条(统一刻度) ---------------------- # 自定义第一组的刻度范围,替换成你实际数据的最小值和最大值 vmin_jet = 0 vmax_jet = 10 # 绘制第一组子图(这里假设前3行的8个为第一组,你可以根据自己的分组调整) jet_mappable = None for ax in axs[0, :]: # 第一行3个 data = np.random.randint(vmin_jet, vmax_jet, (10, 10)) im = ax.imshow(data, cmap='jet', vmin=vmin_jet, vmax=vmax_jet) if jet_mappable is None: jet_mappable = im # 保存第一个mappable对象用于创建色条 for ax in axs[1, :]: # 第二行3个 data = np.random.randint(vmin_jet, vmax_jet, (10, 10)) ax.imshow(data, cmap='jet', vmin=vmin_jet, vmax=vmax_jet) for ax in axs[2, 0:2]: # 第三行前2个,凑够8个 data = np.random.randint(vmin_jet, vmax_jet, (10, 10)) ax.imshow(data, cmap='jet', vmin=vmin_jet, vmax=vmax_jet) # 创建第一个色条的轴(右侧上方,参数:[x位置, y位置, 宽度, 高度]) cbar_ax1 = fig.add_axes([0.82, 0.55, 0.03, 0.35]) fig.colorbar(jet_mappable, cax=cbar_ax1, label='Jet Colorbar') # ---------------------- 第二组:4张子图,RdBu_r色条 ---------------------- # 自定义第二组的刻度范围 vmin_rdbu = -5 vmax_rdbu = 5 rdbu_mappable = None ax = axs[2, 2] # 第三行第3个 data = np.random.randint(vmin_rdbu, vmax_rdbu, (10, 10)) im = ax.imshow(data, cmap='RdBu_r', vmin=vmin_rdbu, vmax=vmax_rdbu) rdbu_mappable = im for ax in axs[3, :]: # 第四行3个,凑够4个 data = np.random.randint(vmin_rdbu, vmax_rdbu, (10, 10)) ax.imshow(data, cmap='RdBu_r', vmin=vmin_rdbu, vmax=vmax_rdbu) # 创建第二个色条的轴(右侧下方) cbar_ax2 = fig.add_axes([0.82, 0.1, 0.03, 0.35]) fig.colorbar(rdbu_mappable, cax=cbar_ax2, label='RdBu_r Colorbar') plt.show()
关键细节提示
- 统一刻度范围:必须给同组所有子图设置相同的
vmin和vmax,这样色条才能准确代表该组所有子图的数值映射。 - 色条位置调整:
fig.add_axes()的四个参数是归一化坐标(0代表左/下,1代表右/上),你可以根据自己的图大小微调[0.82, 0.55, 0.03, 0.35]这些数值,让色条位置更美观。 - mappable对象:只需要保存同组中任意一个子图的
imshow()返回对象,就能创建适配整个组的色条,因为同组的配色和刻度都一致。
内容的提问来源于stack exchange,提问作者Tom Smith
相关产品推荐
相关产品推荐

