使用Cartopy按站点高程条件分色绘制散点地图的方法
按高程分色的Cartopy散点实现方案
所有判断逻辑都放在完成站点属性数组提取之后、正式调用plt.scatter绘图之前完成即可,不需要改动已经写好的读取和基础绘图逻辑。
推荐实现:NumPy布尔索引分组(高效适配大样本)
向量化运算没有循环开销,站点量上万也能保持流畅速度。实现时需要注意将高程阈值区间拆分为互斥范围,避免重叠条件导致同一站点被多次渲染、颜色互相覆盖。
# 在提取完四个站点数组后添加分组逻辑 # 区间拆分(按分色规则): # 1. 高程 <0:黑色 # 2. 5m < 高程 ≤10m:绿色 # 3. 10m < 高程 ≤15m:红色 # 4. 高程 >15m:蓝色 mask_under0 = StationListElev < 0 mask_5to10 = (StationListElev > 5) & (StationListElev <= 10) mask_10to15 = (StationListElev > 10) & (StationListElev <= 15) mask_over15 = StationListElev > 15 # 逐组绘制散点,完全复用原有代码的点大小、透明度、投影设置 plt.scatter(StationListLon[mask_under0], StationListLat[mask_under0], color="black", s=1, alpha=0.5, transform=crs.PlateCarree()) plt.scatter(StationListLon[mask_5to10], StationListLat[mask_5to10], color="green", s=1, alpha=0.5, transform=crs.PlateCarree()) plt.scatter(StationListLon[mask_10to15], StationListLat[mask_10to15], color="red", s=1, alpha=0.5, transform=crs.PlateCarree()) plt.scatter(StationListLon[mask_over15], StationListLat[mask_over15], color="blue", s=1, alpha=0.5, transform=crs.PlateCarree())
简易实现:循环生成颜色映射列表(适合小样本快速调试)
站点量不大的场景下,逐点判断高程所属区间,生成与站点一一对应的颜色列表,单次调用scatter即可完成绘制,逻辑更直观。
color_list = [] for elev in StationListElev: if elev < 0: color_list.append("black") elif elev > 15: color_list.append("blue") elif elev > 10: color_list.append("red") elif elev > 5: color_list.append("green") # 补充规则未覆盖的区间:0<=高程<=5,使用原有默认的dodgerblue else: color_list.append("dodgerblue") # 单次调用scatter传入颜色列表 plt.scatter(StationListLon, StationListLat, c=color_list, s=1, alpha=0.5, transform=crs.PlateCarree())
注意事项
- 不要在原有scatter调用完成后再追加判断逻辑,所有分组操作提前完成,避免重复渲染
- 最初设定的分色规则存在区间重叠问题:如果仅写
elev<0、elev>5、elev>10、elev>15四个独立判断,高程超过15m的站点会同时被三个条件命中,多次叠加绘制,最终显示的颜色会被最后一次渲染的图层覆盖,必须将区间做互斥拆分 - 按现有规则,0<=高程<=5的站点不在分色范围内,建议补充默认配色,否则这部分站点不会被绘制
内容的提问来源于stack exchange,提问作者KMFWeb
相关产品推荐
相关产品推荐

