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

问题描述:

我是一个数据可视化的初学者,甚至更多与cartopy,我知道大多数人我的问题是显而易见的。我正在尝试熟悉cartopy,并成功绘制了文字和点。但我无法实现饼图。在给定的坐标处添加饼图到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()。我试图修改它,但我没有设法让它正常工作。

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

+0

是在与地图的坐标任何方式饼图?或者它更像是一张饼图,你想在地图的同一区域显示,就像在[这个问题]中一样(https://*.com/questions/44200931/cartopy-coastlines-hidden-by-inset-axes -use-的轴馅饼)?我想作为这个问题答案的作者之一,我可能会在这里帮助,但我有问题要理解你到底想做什么。请注意,其他答案使得饼图在海岸线后面变得复杂。如果你想拥有它,应该会容易得多。 – ImportanceOfBeingErnest

+0

我想通过它们的坐标(经度纬度)绘制几个不同的饼图。对于海岸线我不介意。 –

您可以使用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

+0

您的代码在所有地方切换了纬度/经度的位置。虽然结果是正确的。 – swatchai

+0

@swatchai是的,因为它在所有地方都没关系。我现在改了它,谢谢你指出了。 – ImportanceOfBeingErnest