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

如何在Python中为两个GeoDataFrames绘制单个图例

解决Geopandas绘图时合并填色区域与边界图例的问题

问题背景

我用Geopandas绘制科罗拉多州地图,代码如下:

import geopandas as gpd
import matplotlib.pyplot as plt

states_gdf = gpd.read_file('https://www2.census.gov/geo/tiger/GENZ2018/shp/cb_2018_us_state_5m.zip')
CO_gdf = states_gdf[states_gdf['STUSPS'] == 'CO']

fig, ax = plt.subplots()
CO_gdf.plot(ax = ax, column = 'STUSPS')
CO_gdf.boundary.to_frame().plot(ax = ax, color = 'k', label = 'CO Boundary')

想要创建同时包含填色区域和边界的统一图例,但尝试以下代码时,第一个图例被第二个覆盖:

fig, ax = plt.subplots()
CO_gdf.plot(ax = ax, column = 'STUSPS', legend = True)
CO_gdf.boundary.to_frame().plot(ax = ax, color = 'k', label = 'CO Boundary')
ax.legend()

且用ax.get_legend_handles_labels()手动收集句柄时,CO_gdf.plot(...)并未生成对应句柄。

解决方案

问题核心在于:Geopandas通过column参数按属性绘图时,生成的是**颜色条(Colorbar)**而非普通图例条目,因此无法通过常规方法收集句柄。我们需要手动创建填色区域的图例元素,再与边界的图例元素合并。

完整代码实现

import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.patches import Patch

states_gdf = gpd.read_file('https://www2.census.gov/geo/tiger/GENZ2018/shp/cb_2018_us_state_5m.zip')
CO_gdf = states_gdf[states_gdf['STUSPS'] == 'CO']

fig, ax = plt.subplots()

# 绘制填色区域,不自动生成colorbar
CO_plot = CO_gdf.plot(ax=ax, column='STUSPS')
# 获取填充颜色(仅单个区域,直接取第一个颜色值)
fill_color = CO_plot.get_facecolor()[0]

# 绘制边界
CO_gdf.boundary.to_frame().plot(ax=ax, color='k')

# 手动构建图例元素
legend_elements = [
    Patch(facecolor=fill_color, label='Colorado'),
    plt.Line2D([0], [0], color='k', label='CO Boundary')
]

# 添加统一图例
ax.legend(handles=legend_elements)

plt.show()

关键步骤说明

  1. 禁用自动colorbar:调用CO_gdf.plot()时不传入legend=True,避免生成独立的颜色条;
  2. 获取填充颜色:通过绘图返回的对象CO_plot直接提取填充色;
  3. 手动创建图例条目:
    • 用Patch创建填色区域的图例块;
    • 用Line2D创建边界的图例线;
  4. 合并图例:将两个手动创建的元素传入ax.legend(),生成统一的图例。

如果你的场景是多类别填色,只需循环提取每个类别的颜色,创建对应Patch即可。

内容的提问来源于stack exchange,提问作者hm8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:50:24