如何从Matplotlib图例中排除Cartopy元素,仅显示散点标记
解决Cartopy地图图例出现多余矩形的问题
嘿,我看你遇到的问题是用Cartopy和Matplotlib画地图散点时,图例里总是出现多余的空矩形,明明加了label='_nolegend_'也没用对吧?其实问题出在两个地方,我给你捋清楚然后告诉你怎么改:
问题根源
- 你手动给
ax.legend()传了三个条目('','','San Francisco'),前两个空字符串自然会被渲染成空的矩形图例项——这才是多余矩形的真正来源; - 其实
add_subplot和add_image这两个元素默认就不会出现在图例里,你加的label='_nolegend_'完全是多余操作,反而你没给需要显示的散点设置对应的label。
最简单的修复方案
直接给散点指定label,然后让Matplotlib自动生成图例就行,不用手动传那些空条目。修改后的完整代码如下:
# import functions import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.io.img_tiles as cimgt # Create a Stamen terrain background instance stamen_terrain = cimgt.Stamen('terrain-background') fig = plt.figure(figsize = (10,10)) # 移除不必要的label='_nolegend_' ax = fig.add_subplot(1, 1, 1, projection=stamen_terrain.crs) # Set range of map, stipulate zoom level ax.set_extent([-122.7, -121.5, 37.15, 38.15], crs=ccrs.Geodetic()) # 同样移除多余的label参数 ax.add_image(stamen_terrain, 12) # Add scatter point,给散点加上对应的label ax.scatter(-122.4194, 37.7749, s=55, c='k', transform=ccrs.PlateCarree(), label='San Francisco') # 直接调用legend,不需要手动传入条目列表 ax.legend(loc = 3) plt.show()
如果需要更灵活的图例控制
要是你之后有多个绘图元素,只想让特定的几个出现在图例里,可以通过过滤句柄和标签来实现:
# 获取当前轴上所有的图例句柄和对应标签 handles, labels = ax.get_legend_handles_labels() # 筛选出你想要保留的条目,这里只留'San Francisco' keep_indices = [i for i, label in enumerate(labels) if label == 'San Francisco'] filtered_handles = [handles[i] for i in keep_indices] filtered_labels = [labels[i] for i in keep_indices] # 用筛选后的内容创建图例 ax.legend(filtered_handles, filtered_labels, loc=3)
这样处理后,图例里就只会显示你需要的散点标记,多余的矩形完全消失啦~
内容的提问来源于stack exchange,提问作者Michael Boles
相关产品推荐
相关产品推荐

