如何在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()
关键步骤说明
- 禁用自动colorbar:调用
CO_gdf.plot()时不传入legend=True,避免生成独立的颜色条; - 获取填充颜色:通过绘图返回的对象
CO_plot直接提取填充色; - 手动创建图例条目:
- 用
Patch创建填色区域的图例块; - 用
Line2D创建边界的图例线;
- 用
- 合并图例:将两个手动创建的元素传入
ax.legend(),生成统一的图例。
如果你的场景是多类别填色,只需循环提取每个类别的颜色,创建对应Patch即可。
内容的提问来源于stack exchange,提问作者hm8
相关产品推荐
相关产品推荐

