如何为geopandas.GeoDataFrame.plot()设置自定义图例标签?
解决GeoDataFrame.plot()自定义百分比图例标签的问题
我帮你梳理下解决这个问题的思路和方案,你遇到的核心问题确实和GeoPandas版本有关:
核心问题解析
为什么
ax.get_legend()返回None?
当你用GeoDataFrame.plot()绘制数值列的分级着色图(choropleth)时,GeoPandas默认创建的是Colorbar(颜色条),而不是普通的matplotlib Legend对象,所以ax.get_legend()会返回None,你需要针对Colorbar来操作。为什么
legend_kwds参数报错?
没错,legend_kwds参数是在GeoPandas 0.4.0版本之后才加入的,你的0.3.0版本不支持这个参数,所以会抛出"Unknown property legend_kwds"的错误。
解决方案1:升级GeoPandas到支持legend_kwds的版本
如果条件允许,升级到GeoPandas 0.4.0及以上版本就能直接使用legend_kwds参数来配置图例。你可以通过以下命令升级:
用pip安装最新稳定版
pip install --upgrade geopandas
或者从GitHub源码安装最新开发版
pip install git+https://github.com/geopandas/geopandas.git
升级完成后,你可以这样实现百分比图例标签:
import geopandas as gpd import matplotlib.pyplot as plt import numpy as np # 读取数据 gdf = gpd.read_file("kcmo_counties.geojson") numpoints = 5 leg_min = gdf['val'].min() leg_max = gdf['val'].max() # 生成百分比标签 leg_tick_labels = [f"{round(x*100, 1)}%" for x in np.linspace(leg_min, leg_max, numpoints)] # 配置legend_kwds字典 leg_kwds_dict = { 'ticks': np.linspace(leg_min, leg_max, numpoints), 'labels': leg_tick_labels, # 可选:添加其他颜色条配置,比如位置、方向等 # 'orientation': 'horizontal' } # 绘图并应用配置 f, ax = plt.subplots(1, figsize=(6,6)) gdf.plot('val', legend=True, ax=ax, legend_kwds=leg_kwds_dict) plt.show()
解决方案2:旧版本(<0.4.0)下手动修改Colorbar标签
如果无法升级版本,你可以通过获取Colorbar对象来手动修改刻度标签,具体代码如下:
import geopandas as gpd import matplotlib.pyplot as plt import numpy as np # 读取数据 gdf = gpd.read_file("kcmo_counties.geojson") # 先绘制图形 f, ax = plt.subplots(1, figsize=(6,6)) gdf.plot('val', legend=True, ax=ax) # 获取Colorbar对象:通过ax.collections[0]拿到着色的图层集合 cbar = ax.get_figure().colorbar(ax.collections[0]) numpoints = 5 leg_min = gdf['val'].min() leg_max = gdf['val'].max() # 设置Colorbar的刻度位置 cbar.set_ticks(np.linspace(leg_min, leg_max, numpoints)) # 设置百分比格式的刻度标签 cbar.set_ticklabels([f"{round(x*100, 1)}%" for x in np.linspace(leg_min, leg_max, numpoints)]) plt.show()
这个方法的关键是:分级着色图的颜色条是基于图层集合创建的,所以我们通过ax.collections[0]获取这个集合,再调用figure的colorbar()方法拿到Colorbar对象,之后就可以用set_ticks()和set_ticklabels()来修改标签了。
内容的提问来源于stack exchange,提问作者claytonrsh
相关产品推荐
相关产品推荐

