如何在matplotlib中为图像子图添加自定义0-10范围的colorbar并修复报错
问题排查与实现方案
报错根因
Axes子图对象没有colorbar()方法,该方法属于Figure画布对象,直接调用ax.colorbar()会触发属性错误- 未给
imshow指定vmin/vmax参数,无法固定数值映射范围为0-10 - 画布创建完成后再修改
plt.rcParams['figure.figsize']全局配置,不会对已生成的画布生效 - 你使用的
cmap='reds'写法错误,matplotlib内置红色系色卡名为大小写敏感的Reds,小写会触发色卡不存在报错
修正后可运行代码
import matplotlib.pyplot as plt import matplotlib.image as image import numpy as np # 读取图像 image1 = image.imread('a.jpg') image2 = image.imread('b.jpg') image3 = image.imread('c.jpg') # 【可选】如果原始图像数值不是0-10范围,先做缩放,比如jpg默认是0-255的话就用下面的代码 # image1 = image1 / 255 * 10 # image2 = image2 / 255 * 10 # image3 = image3 / 255 * 10 # 定义子图,直接在这里指定画布尺寸即可 fig1, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(20,4)) # 子图1 im1 = ax1.imshow(image1, extent=(60, 70, 23.5, 25.0), cmap='Reds', zorder=-1, aspect='auto', vmin=0, vmax=10) ax1.xaxis.set_visible(False) ax1.yaxis.set_visible(False) # 给当前子图绑定独立colorbar fig1.colorbar(im1, ax=ax1) # 子图2 im2 = ax2.imshow(image2, extent=(60, 70, 23.5, 25.0), cmap='Reds', zorder=-1, aspect='auto', vmin=0, vmax=10) ax2.xaxis.set_visible(False) ax2.yaxis.set_visible(False) fig1.colorbar(im2, ax=ax2) # 子图3 im3 = ax3.imshow(image3, extent=(60, 70, 23.5, 25.0), cmap='Reds', zorder=-1, aspect='auto', vmin=0, vmax=10) ax3.xaxis.set_visible(False) ax3.yaxis.set_visible(False) fig1.colorbar(im3, ax=ax3) plt.tight_layout() # 自动调整布局避免colorbar挤压子图 plt.show()
实现效果说明
- 每个子图右侧生成独立的colorbar,不会互相干扰
- 所有colorbar数值范围统一固定为0-10,数值映射逻辑全局一致
- 自动调整子图间距,避免colorbar和子图重叠
内容的提问来源于stack exchange,提问作者Namra Mahad
相关产品推荐
相关产品推荐

