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

Matplotlib多子图双颜色条配置咨询:两类子图需对应设置色条

在Matplotlib右侧添加两个独立通用颜色条的解决方案

当然可以!完全能在图的右侧放置两个独立的通用颜色条,分别对应你的两组子图。核心思路是手动创建额外的轴对象来放置两个色条,同时确保同组子图使用统一的刻度范围,让色条能适配该组所有子图。

实现步骤说明

  1. 调整子图布局:缩小subplots_adjust的right参数,给右侧留出足够空间放置两个色条(比如设为0.75,默认是0.9)。
  2. 分组绘制子图:
    • 第一组8张子图统一使用jet配色,并且设置相同的vmin和vmax来固定刻度范围,保证色条通用。
    • 第二组4张子图同理,使用RdBu_r配色并统一刻度。
  3. 创建色条轴:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:28