使用geoplot时标记与颜色条颜色不匹配的问题解决咨询
问题:地震标记颜色与颜色条不匹配
我正通过经纬度绘制各地震的位置,使用GeoJSON数据绘制底图,再利用数据中的Longitude(经度)和Latitude(纬度)列在地图上绘制标记。但标记颜色与颜色条不匹配:标注为8.2的震级标记按颜色条应呈现深红色,实际却显示为偏黄色,请问该如何解决此问题?
geojson_path = '/content/drive/MyDrive/ColabNotebooks/Practice/nepal.geojson' gdf = gpd.read_file(geojson_path) # 读取CSV数据 mydata = pd.read_csv('/content/drive/MyDrive/ColabNotebooks/Practice/earthquakes.tsv', sep='\t') df = mydata[mydata['Mag'].notnull()] # 从经纬度创建GeoDataFrame geometry = gpd.points_from_xy(df['Longitude'], df['Latitude']) gdf_points = gpd.GeoDataFrame(df, geometry=geometry) # 设置画布尺寸 fig, ax = plt.subplots(figsize=(15, 8)) # 定义颜色映射和归一化规则 cmap = plt.get_cmap('YlOrRd') # 可替换为其他配色 norm = Normalize(vmin=df['Mag'].min(), vmax=df['Mag'].max()) # 绘制底图 gdf.plot(ax=ax) # 绘制地震点标记 scatter = gdf_points.plot( ax=ax, cmap=cmap, markersize=(df['Mag']) * 200, c=df['Mag'], # 用震级值映射颜色 norm=norm, alpha=1 ) # 添加颜色条 sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm) sm.set_array([]) cbar = plt.colorbar(sm, ax=ax, label='震级') # 为每个标记标注震级 for x, y, label in zip(df['Longitude'], df['Latitude'], df['Mag']): plt.text(x, y, str(label), color='white', ha='center', va='center') plt.title('CSV数据地震点位可视化') plt.show()

解决方案
问题核心是GeoPandas的plot()方法没有正确识别你定义的norm归一化参数,导致颜色映射逻辑和颜色条脱节。可以通过以下两种方式解决:
方法1:改用Matplotlib原生scatter绘制点
直接用Matplotlib的底层方法绘制散点,能确保颜色和归一化规则完全匹配:
# 替换原代码中gdf_points.plot()的部分 scatter = ax.scatter( df['Longitude'], df['Latitude'], c=df['Mag'], cmap=cmap, norm=norm, s=df['Mag'] * 200, alpha=1 )
方法2:提前归一化震级值
如果坚持用GeoPandas的plot(),可以先手动对震级值做归一化,再传入颜色参数:
# 先对震级值做归一化处理 df['Mag_normalized'] = norm(df['Mag']) # 绘制时使用归一化后的值 scatter = gdf_points.plot( ax=ax, cmap=cmap, markersize=(df['Mag']) * 200, c=df['Mag_normalized'], alpha=1 )
额外检查项
- 确认
df['Mag']是数值类型(如float),字符串类型会导致颜色映射失效 - 检查
df['Mag'].min()和df['Mag'].max()的结果,若数据存在异常值,会拉宽颜色条范围,导致高震级的颜色偏浅
内容的提问来源于stack exchange,提问作者BlueYeti81
相关产品推荐
相关产品推荐

