如何在Matplotlib中叠加两张图像并使用不同colormap?
在Matplotlib中叠加双图层并设置不同色阶(Colormap)
要实现科学论文中常见的双图叠加效果(比如海拔+起火时间),核心是通过两次imshow调用分别绘制图层,配合透明度和自定义色阶来实现。以下是具体实现步骤和代码示例:
核心步骤
- 用
imshow绘制底层基础数据(如海拔),选择灰色系色阶 - 再次调用
imshow绘制上层目标数据(如起火时间),选择橙色系色阶,并设置合适的透明度alpha - 为两个图层分别添加色条,确保图例清晰
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 1. 生成模拟数据(替换为你的真实数据) # 海拔数据:100x100网格,范围0-2000米 elevation = np.random.randint(0, 2000, size=(100, 100)) # 起火时间数据:仅30%区域有值,范围1-24小时,空值用NaN填充 fire_time = np.full_like(elevation, np.nan) fire_mask = np.random.rand(100, 100) > 0.7 fire_time[fire_mask] = np.random.randint(1, 24, size=fire_mask.sum()) # 2. 创建画布和轴对象 fig, ax = plt.subplots(figsize=(8, 6)) # 3. 绘制底层海拔图(灰色系色阶) im_elev = ax.imshow(elevation, cmap='Greys', extent=[0, 100, 0, 100]) # 4. 绘制上层起火时间图(橙色系色阶,设置透明度) im_fire = ax.imshow(fire_time, cmap='Oranges', alpha=0.6, extent=[0, 100, 0, 100], vmin=1, vmax=24) # 5. 添加色条并设置标签 # 海拔色条 cbar_elev = plt.colorbar(im_elev, ax=ax, fraction=0.046, pad=0.04) cbar_elev.set_label('海拔 (m)') # 起火时间色条 cbar_fire = plt.colorbar(im_fire, ax=ax, fraction=0.046, pad=0.04) cbar_fire.set_label('起火时间 (小时)') # 6. 调整布局并显示 plt.tight_layout() plt.show()
关键细节说明
- 透明度调整:
alpha参数建议设置在0.4-0.8之间,既能保留底层数据的可见性,又能突出上层数据 - 色阶选择:灰色系可选
Greys、gray,橙色系可选Oranges、OrRd;如果需要自定义色阶,可使用matplotlib.colors.LinearSegmentedColormap - 数据对齐:确保两个图层的
extent(坐标范围)完全一致,避免图层错位;如果使用地理坐标,可配合地理绘图库处理 - 空值处理:用
np.nan填充上层数据的空值区域,imshow会自动跳过这些区域,让底层数据自然透出
内容的提问来源于stack exchange,提问作者Mohamad Marjani
相关产品推荐
相关产品推荐

