使用Python Cartopy绘制颜色表温度、方块大小表不确定性的双变量地图
实现方案说明
不需要额外引入第三方依赖,仅用Matplotlib + Cartopy即可完成需求,核心通过Matplotlib的scatter接口的双参数映射能力实现:
- 颜色映射:通过
c参数传入温度变化数据,指定cmap='coolwarm'即可实现温度的颜色编码 - 不确定性映射:通过
marker='s'指定散点为方块形状,用s参数传入不确定性数据,可按需添加缩放系数调整方块的显示大小比例
核心实现步骤
- 正常定义Cartopy的地图投影、加载底图要素
- 准备好经纬度网格、温度变化、不确定性三组对齐的一维数据
- 调用
ax.scatter传入参数:- 经纬度坐标、
transform参数指定坐标参考系 c=温度变化数组、cmap='coolwarm'marker='s'、s=不确定性数组 * 缩放系数(缩放系数按需调整到合适的显示尺寸)
- 经纬度坐标、
- 调用
plt.colorbar绑定scatter返回的对象生成温度色条,可通过调整norm等参数匹配你需要的色条效果 - 若需要展示不确定性对应的大小参考,可以单独自定义大小图例添加到画布合适位置
示例代码
import cartopy.crs as ccrs import matplotlib.pyplot as plt import numpy as np # 模拟测试数据:100个随机分布的网格点 np.random.seed(42) lon = np.random.uniform(-180, 180, 100) lat = np.random.uniform(-90, 90, 100) temp_change = np.random.uniform(-5, 5, 100) # 温度变化范围-5~5℃ uncertainty = np.random.uniform(0.1, 3, 100) # 不确定性范围0.1~3℃ # 初始化Cartopy地图 fig = plt.figure(figsize=(12, 6)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) ax.coastlines(linewidth=0.5) ax.gridlines(draw_labels=True, linestyle='--', alpha=0.7) # 绘制方块散点 scatter = ax.scatter( lon, lat, c=temp_change, cmap='coolwarm', marker='s', # 方块标记 s=uncertainty * 30, # 不确定性乘缩放系数调整大小 alpha=0.8, transform=ccrs.PlateCarree() ) # 添加温度色条 cbar = plt.colorbar(scatter, ax=ax, pad=0.1) cbar.set_label('温度变化 (℃)') # 可选:添加不确定性大小图例 for size in [0.5, 1, 2, 3]: ax.scatter([], [], c='gray', marker='s', s=size*30, label=f'{size} ℃') ax.legend(scatterpoints=1, frameon=True, labelspacing=1, title='不确定性', bbox_to_anchor=(1.2, 0.3)) plt.show()
内容的提问来源于stack exchange,提问作者Conni
相关产品推荐
相关产品推荐

