如何配置地理绘图中图例标记的边缘颜色?
问题:如何给GeoPandas点地图的图例标记添加黑色边缘?
我正在绘制带有点要素的地图,希望图例中的标记带有黑色边缘。已在绘图代码的legend_kwds中设置了edgecolor参数,但未达到预期效果,请问该如何配置?
我的代码如下:
import geopandas as gpd import cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.pyplot as plt # 创建一个包含经纬度坐标的GeoDataFrame df = df_unique gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['modern_longitude'], df['modern_latitude']),crs='EPSG:4326') #创建投影对象 robinson = ccrs.Robinson() # 将 GeoDataFrame 投影到 Robinson 投影坐标系下 gdf_robinson = gdf.to_crs(ccrs.Robinson().proj4_init) # 读取地图数据 map_path = "110m_physical/ne_110m_land.shp" world = gpd.read_file(map_path) world=world.to_crs(ccrs.Robinson().proj4_init) # 创建绘图对象 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(1, 1, 1, projection=robinson) ax2 = ax # 添加数据 world.plot(ax=ax2, color='lightgray', edgecolor='black') gdf_robinson.plot(ax=ax, legend=True, legend_kwds = {"loc":'center left', "bbox_to_anchor": (1.1, 0.5),"title":"proxy"},column='proxy',cmap='tab20', markersize=50,edgecolor='black') # ax.set_axis_off() plt.show()
解决方案
GeoPandas的plot方法中,legend_kwds参数里的edgecolor不会直接作用于图例标记,因为图例的可视化元素是独立生成的。需要在绘图完成后,手动获取图例对象并修改每个标记的边缘颜色。
修改后的代码如下:
import geopandas as gpd import cartopy.crs as ccrs import matplotlib.pyplot as plt # 创建GeoDataFrame df = df_unique gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['modern_longitude'], df['modern_latitude']),crs='EPSG:4326') # 投影转换 robinson = ccrs.Robinson() gdf_robinson = gdf.to_crs(robinson.proj4_init) # 读取地图数据 map_path = "110m_physical/ne_110m_land.shp" world = gpd.read_file(map_path).to_crs(robinson.proj4_init) # 创建绘图对象 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(1, 1, 1, projection=robinson) # 绘制底图和点数据 world.plot(ax=ax, color='lightgray', edgecolor='black') # 绘图时捕获图例对象 plot_result = gdf_robinson.plot(ax=ax, legend=True, legend_kwds={"loc":'center left', "bbox_to_anchor": (1.1, 0.5),"title":"proxy"}, column='proxy',cmap='tab20', markersize=50,edgecolor='black') # 获取图例并修改标记边缘颜色 legend = plot_result.get_legend() for handle in legend.legendHandles: handle.set_edgecolor('black') # 可选:调整边缘线宽,让黑色边缘更明显 handle.set_linewidth(1.5) # ax.set_axis_off() plt.show()
关键修改说明
- 捕获
gdf_robinson.plot()的返回值,通过该对象获取图例 - 遍历图例的每个
legendHandle,调用set_edgecolor()设置黑色边缘 - 可选添加
set_linewidth()调整边缘线宽,提升视觉效果
内容的提问来源于stack exchange,提问作者keweizhou
相关产品推荐
相关产品推荐

