将给定坐标处的饼图添加到cartopy投影

时间:2017-07-23 15:45:15

标签: python-3.x matplotlib pie-chart cartopy

我是数据可视化的初学者,甚至更多关于数据可视化,我知道对于大多数人来说,我的问题是显而易见的。我试图熟悉cartopy,我成功地绘制文字和点。但我无法实现饼图。

我只想在特定投影上绘制饼图。但我真的很困惑,尽管有纸箱的文件。我先试试这个:

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines(resolution='110m')  # 110, 50, 10
ax.stock_img() 

lat, long = 30, 30 # the latitude longitude
ax.pie(long, lat, [0.25, 0.75], transform=ccrs.PlateCarree())

那不起作用,所以我已经检查过,我发现了这个Cartopy coastlines hidden by inset_axes use of Axes.pie,但我不明白发生了什么,而且它似乎仅限于PlateCarre()。我试图修改它,但我没有设法让它正常工作。

所以我非常简单的问题是如何在给定纬度和经度的特定投影中添加几个饼图?如果你能得到答案,我们将非常欢迎你。

1 个答案:

答案 0 :(得分:4)

您可以使用inset_axes将新轴放入绘图中,这将允许托管饼图。 inset_axes的位置由bbox_to_anchor参数确定。要使此参数使用折纸轴(ax)的投影坐标,您需要设置bbox_transform=ax.transData。 如果您的坐标位于不同的坐标系中,则需要先使用投影的.transform_point方法将它们转换为正在使用的坐标系。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines(resolution='110m')
ax.stock_img() 


def plot_pie_inset(data,ilon,ilat,ax,width):
    ax_sub= inset_axes(ax, width=width, height=width, loc=10, 
                       bbox_to_anchor=(ilon, ilat),
                       bbox_transform=ax.transData, 
                       borderpad=0)
    wedges,texts= ax_sub.pie(data)

    ax_sub.set_aspect("equal")

lon,lat = 90,30
lonr,latr =  ccrs.Robinson().transform_point(lon,lat, ccrs.PlateCarree())
plot_pie_inset([0.25, 0.75],lonr,latr,ax,0.5)


plt.show()

enter image description here