如何在Geopandas地图绘图中按X、Y坐标定位饼图?
在Geopandas地图中通过XY坐标定位饼图的方法
核心思路是利用matplotlib的inset_axes创建嵌入式子轴,并将其绑定到Geopandas地图的主坐标轴数据系统中,这样就能通过XY坐标精准定位饼图,同时避免破坏原有地图布局。
完整实现代码
import geopandas as gpd import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes # 加载底图数据(示例用世界地图) world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) fig, ax = plt.subplots(figsize=(10, 6)) world.plot(ax=ax, color='lightgray', edgecolor='white') # 示例点数据:包含XY坐标、饼图各部分占比、对应颜色 point_data = { 'x': [0, 100, -50], 'y': [0, 30, -20], 'pie_sizes': [[30, 70], [40, 60], [20, 50, 30]], 'pie_colors': [['#ff9999','#66b3ff'], ['#99ff99','#ffcc99'], ['#c2c2f0','#ffb3e6','#c4e17f']] } # 循环为每个点绘制饼图 for x, y, sizes, colors in zip(point_data['x'], point_data['y'], point_data['pie_sizes'], point_data['pie_colors']): # 创建嵌入式子轴,绑定主轴的数据坐标系统 pie_ax = inset_axes( ax, width=0.05, # 饼图宽度(主轴宽度的比例) height=0.05, # 饼图高度(主轴高度的比例) bbox_transform=ax.transData, # 关键:使用主轴的数据坐标解析位置 bbox_to_anchor=(x, y) # 饼图中心对应的XY坐标 ) # 绘制饼图并隐藏子轴的边框和刻度 pie_ax.pie(sizes, colors=colors) pie_ax.set_aspect('equal') pie_ax.axis('off') plt.tight_layout() plt.show()
关键细节说明
- 坐标绑定:
bbox_transform=ax.transData是核心,它让matplotlib用主地图轴的数据坐标(即你的XY坐标系统)来定位饼图,而不是默认的画布归一化坐标,这解决了之前创建子轴位置错乱的问题。 - 饼图大小调整:
width和height参数用浮点数时,代表占主轴尺寸的比例(比如0.05就是5%),可根据地图缩放级别灵活调整;也可以用绝对单位(如width='30px')固定大小。 - CRS一致性:确保你的XY坐标和底图的坐标系(CRS)完全一致,否则饼图会出现在错误位置。
- 位置微调:如果饼图需要偏离点中心,可修改
bbox_to_anchor的数值,比如(x+3, y+2)让饼图向右上方偏移。
内容的提问来源于stack exchange,提问作者HaroldIV
相关产品推荐
相关产品推荐

