Добавление круговой диаграммы по заданным координатам в картографическую проекцию

Я новичок в визуализации данных, а в картопии тем более, знаю, что для большинства людей мой вопрос был бы очевиден. Я пытаюсь познакомиться с картопией, и я успешно рисую текст и точку. Но я не мог добиться этого для круговой диаграммы.

Я просто хочу построить круговую диаграмму в определенной проекции. Но я действительно запутался, несмотря на документацию 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 береговые линии, скрытые inset_axes, используют Axes.pie, но я не понимаю, что происходит под капотом, и, кроме того, это кажется ограниченным PlateCarre(). Я попытался изменить его, но мне не удалось заставить его работать должным образом.

Итак, мой очень простой вопрос: как добавить несколько круговых диаграмм к определенной проекции с учетом широты и долготы? Если вы сможете развить свой ответ, вам будет очень приятно.


person RomainL.    schedule 23.07.2017    source источник
comment
Связана ли круговая диаграмма каким-либо образом с координатами карты? Или это скорее круговая диаграмма, которую вы хотите показать в той же области, что и карта, например, в этот вопрос? Я думаю, как автор одного из ответов на этот вопрос, я, вероятно, смогу помочь здесь, но у меня проблемы с пониманием того, что именно вы хотите сделать. Имейте в виду, что другой ответ усложняет то, что круговая диаграмма находится за береговой линией. Если вы хотите иметь его выше, это должно быть намного проще.   -  person ImportanceOfBeingErnest    schedule 23.07.2017
comment
Я хочу построить несколько разных круговых диаграмм по их координатам (долгота и широта). Для береговой линии я не против.   -  person RomainL.    schedule 24.07.2017


Ответы (1)


Вы можете использовать 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()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 24.07.2017
comment
Ваш код поменял местами широту/долготу во всех местах. Хотя результат правильный. - person swatchai; 29.09.2017
comment
@swatchai Да, потому что это было во всех местах, это не имело значения. Я сейчас изменил его, спасибо, что указали на это. - person ImportanceOfBeingErnest; 29.09.2017