如何将Seaborn环形柱状图叠加到地图并匹配指定坐标?
如何在地图上叠加偏移到指定经纬度的Seaborn环形柱状图
问题描述
我需要把一张地图图片和Seaborn环形柱状图叠加,同时将环形柱状图定位到地图上的指定经纬度位置,实现类似目标示例图的效果。但写代码时遇到了两个问题:
- 加上
subplot_kw=dict(polar=True)会让背景地图变形 - 删掉这个参数后,柱状图变成了矩形,没法实现环形效果
想知道能不能通过定义不同坐标轴或其他方式解决这个问题,最终基于参考方案得到了可行代码。
解决方案
核心思路是创建两个独立的坐标轴:一个用笛卡尔坐标系显示地图,另一个用极坐标系绘制环形柱状图,再通过调整极坐标轴的位置和尺寸,把它精准对应到地图上的目标经纬度区域。
以下是可行代码示例:
import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 1. 加载本地地图图片 map_img = plt.imread("your_map_path.png") # 替换成你的地图文件路径 # 2. 创建主画布和地图专用坐标轴 fig, ax_map = plt.subplots(figsize=(10, 8)) # 替换extent里的数值为你的地图实际经纬度范围 [最小经度, 最大经度, 最小纬度, 最大纬度] ax_map.imshow(map_img, extent=[110, 120, 30, 40]) # 3. 创建独立的极坐标坐标轴,用于绘制环形柱状图 # [left, bottom, width, height] 是相对于画布的比例(范围0-1),根据地图目标位置调整 ax_polar = fig.add_axes([0.35, 0.45, 0.2, 0.2], polar=True) # 4. 绘制Seaborn环形柱状图(径向条形图) categories = ["类别1", "类别2", "类别3", "类别4"] values = [15, 25, 20, 30] angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False) # 配置环形柱状图样式 sns.barplot(x=angles, y=values, ax=ax_polar, palette="coolwarm", width=0.6) ax_polar.set_theta_zero_location("N") # 设置极坐标零点指向正北 ax_polar.set_theta_direction(-1) # 设置角度顺时针递增 ax_polar.set_yticklabels([]) # 隐藏径向刻度标签 ax_polar.set_xticks(angles) ax_polar.set_xticklabels(categories) plt.show()
关键细节说明
- 地图轴
ax_map用笛卡尔坐标系,通过extent参数匹配地图的真实经纬度范围,保证地图显示正常 - 极坐标轴
ax_polar通过fig.add_axes()独立创建,[left, bottom, width, height]四个参数是相对于整个画布的比例,需要根据地图上目标经纬度的位置换算调整,实现精准定位 - 调整极坐标的零点位置和角度方向,让环形图的方位逻辑和地图保持一致
内容的提问来源于stack exchange,提问作者AaronJPung
相关产品推荐
相关产品推荐

