我有一张地图图像,还有一个圆形的 Seaborn 条形图。地图如下所示:
Seaborn 的图如下所示:
我怎样才能将两者重叠,并使地图上的 Seaborn 图偏移以匹配特定坐标?例如,我想要类似下图的东西,其中圆形条形图在图像上偏移,已知坐标指示特定的纬度、经度位置。
我尝试使用这个例子中的代码:
img = plt.imread('map.jpg')
fig, ax = plt.subplots(figsize=(6, 6))
plt.style.use('dark_background')
sns.barplot(x='Provider', y='Var_diff', hue='Provider', data=one_stat, ax=ax,
palette='gist_rainbow', legend=False)
# Turn off surrounding circular frame
ax.set_frame_on(False)
# Turn off axis labels
ax.set(xlabel=None); ax.set(ylabel=None)
ax.set(xticks=[]); ax.set(yticks=[])
ax.imshow(img, extent=[-18, 18, -9, 9])
,但使用相同的参数(subplot_kw=dict(polar=True)
)在图形和轴定义中使条形图呈圆形(例如fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
)弯曲背景图像以匹配圆形条形图:
去掉参数会得到纯矩形图:
有没有办法定义两个不同的图形和轴并将它们重叠?或者我如何才能获得最终结果?
解决方案
使用@Stef 的回复,我的最终绘图命令最终是:
img = plt.imread('map.jpg')
fig, ax_bg = plt.subplots()
ax_bars = fig.add_axes(rect=(0.2, 0.2, 0.2, 0.2), polar=True)
plt.style.use('dark_background')
sns.barplot(x='Provider', y='Var_diff', hue='Provider',
data=one_stat, ax=ax_bars, palette='gist_rainbow', legend=False)
# Turn off surrounding circular frame
ax_bars.set_frame_on(False)
# Turn off axis labels
ax_bars.set(xlabel=None); ax_bars.set(ylabel=None)
ax_bars.set(xticks=[]); ax_bars.set(yticks=[])
ax_bg.imshow(img, extent=[-180, 180, -90, 90])
产生
您可以先为背景图像创建轴,然后在其上为极坐标条形图创建另一个轴。唯一的困难是获取条形轴的矩形坐标。如果您不想使用反复试验,您可以先从数据转换为显示坐标
ax_bg.transData.transform(...)
,然后再转换fig.transFigure.inverted().transform(...)
为条形轴的矩形坐标的图形坐标。