You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Matplotlib图例中排除Cartopy元素,仅显示散点标记

解决Cartopy地图图例出现多余矩形的问题

嘿,我看你遇到的问题是用Cartopy和Matplotlib画地图散点时,图例里总是出现多余的空矩形,明明加了label='_nolegend_'也没用对吧?其实问题出在两个地方,我给你捋清楚然后告诉你怎么改:

问题根源

  1. 你手动给ax.legend()传了三个条目('','','San Francisco'),前两个空字符串自然会被渲染成空的矩形图例项——这才是多余矩形的真正来源;
  2. 其实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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:55:49