Cartopy - несколько стрелок с использованием аннотации

Используя это решение в качестве основы, возможно ли создать несколько стрелок, исходящих из одного и того же источника к разным целям? например, Дели -> Пекин (116,4, 39,9), Дели -> Каир (30,0, 31,2), Дели -> Токио (35,6, 139,6)?

Когда я повторяю код ниже, я получаю только первую стрелку.

#Dehli - Beijing  
    ax.annotate('Beijing', xy=(116.4, 39.9), xycoords=transform,
            size=40,
            )

    ax.annotate('Delhi', xy=(113, 40.5), xytext=(77.23, 28.61),
            size=40,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.2",
                           ),
            xycoords=transform,
               )

#Dehli - Cairo  
    ax.annotate('Cairo', xy=(-6.26, 53.34), xycoords=transform,
            size=40,
            )

    ax.annotate('Delhi', xy=(113, 40.5), xytext=(77.23, 28.61),
            size=40,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.2",
                           ),
            xycoords=transform,
               )

Кроме того, есть ли способ поместить.annotate в это выражение, которое я использую в настоящее время для рисования соединительных линий. Я пытался безрезультатно:

#Coordinates
lon_dehl, lat_dehl = 116.4, 39.9
lon_beij, lat_beij = 77.59, 12.97
lon_toky, lat_toky = 35.6, 139.6
lon_cair, lat_cair = 30.0, 31.2

plt.plot([lon_dehl, lon_beij], [lat_dehl, lat_beij],
     linewidth=2,
         linestyle='solid',
         solid_capstyle='round',
         color='#cb2c31',
        marker='o', 
         markersize=6,
         markeredgewidth=None, 
         markeredgecolor='#cb2c31',
     transform=ccrs.PlateCarree(),
        )

1 ответ

Это не идеально (на самом деле, я бы приветствовал любые улучшения), но я добился нескольких стрелок с annotate,

Теория такова: используйте то же самое source для всех стрелок, но измените targetlat-lons (или, вернее, lon-lat). Кажется очевидным сейчас.

Кроме того, не используйте annotate для названий городов. Annotate кажется, имя ставится в начале стрелки, а не в конечной точке.

Как я уже сказал, я бы приветствовал любые предложения по улучшению (в том числе для маркировки).

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from pyproj import Proj, transform

def main():
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.set_extent([-150, 60, -25, 60])

    ax.add_feature(cfeature.LAND)
    ax.add_feature(cfeature.OCEAN)
    ax.add_feature(cfeature.COASTLINE)
    ax.add_feature(cfeature.BORDERS)


    #Labels - city locations & names
    ax.plot(77.20, 28.61, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(65, 33, 'Dehli', transform=ccrs.Geodetic())

    ax.plot(139.69, 35.68, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(139.69, 35.68, 'Tokyo', transform=ccrs.Geodetic())

    ax.plot(0.12, 51.50, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(0.12, 51.50, 'London', transform=ccrs.Geodetic())

    ax.plot(-71.05, 42.36, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(-71.05, 42.36, 'New York', transform=ccrs.Geodetic())

    ax.plot(151.81, -33.86, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(151.81, -33.86, 'Sydney', transform=ccrs.Geodetic())

    ax.plot(-43.2, -22.9, 'bo', markersize=7, transform=ccrs.Geodetic())
    ax.text(-43.2, -22.9, 'Rio', transform=ccrs.Geodetic())


    #Arrows lines 

    transform = ccrs.PlateCarree()._as_mpl_transform(ax)


    #Dehli to Tokyo
    ax.annotate('', xy=(139.69, 35.68), xytext=(77.20, 28.61),
            xycoords='data',
            size=20,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.3"))

    #Dehli to London
    ax.annotate('', xy=(0.12, 51.50), xytext=(77.20, 28.61), 
            size=10,
            xycoords='data',
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.3"))

    #Dehli to New York
    ax.annotate('', xy=(-71.05, 42.36), xytext=(77.20, 28.61),
            xycoords='data',
            size=30,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.3"))

    #Dehli to Sydney
    ax.annotate('', xy=(151.81, -33.86), xytext=(77.20, 28.61),
            xycoords='data',
            size=10,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.3"))

    #Dehli to Rio
    ax.annotate('', xy=(-43.2, -22.9), xytext=(77.20, 28.61),
            xycoords='data',
            size=20,
            arrowprops=dict(facecolor='red', ec = 'none',
                            arrowstyle="fancy",
                            connectionstyle="arc3,rad=-0.3")
               )


    #plt.tight_layout()
    plt.show()


if __name__ == '__main__':
    main()

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

Другие вопросы по тегам