2017-07-23 63 views
1

我是一個數據可視化的初學者,甚至更多與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://stackoverflow.com/questions/44200931/cartopy-coastlines-hidden-by-inset-axes -use-的軸餡餅)?我想作爲這個問題答案的作者之一,我可能會在這裏幫助,但我有問題要理解你到底想做什麼。請注意,其他答案使得餅圖在海岸線後面變得複雜。如果你想擁有它,應該會容易得多。 – ImportanceOfBeingErnest

+0

我想通過它們的座標(經度緯度)繪製幾個不同的餅圖。對於海岸線我不介意。 –

回答

3

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