2016-07-11 12 views
0

Mit this solution als Basis, ist es möglich, mehrere Pfeile aus der gleichen Quelle zu verschiedenen Zielen zu erstellen? z.B. Delhi -> Peking (116.4, 39.9), Delhi -> Kairo (30.0, 31.2), Delhi -> Tokio (35.6, 139.6)?Cartopy - mehrere Pfeile mit Anmerkungen

Wenn ich den Code unten wiederhole, bekomme ich nur den ersten Pfeil.

#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, 
       ) 

Alternativ ist es eine Möglichkeit, .annotate in diesen Ausdruck zu bringen, die ich gegenwärtig bin mit Verbindungslinien zu zeichnen. Ich habe ohne Erfolg versucht:

#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(), 
     ) 

Antwort

1

Dies ist nicht perfekt (in der Tat, würde ich keine Verbesserungen begrüßen), aber ich erreichte mehrere Pfeile mit annotate.

Die Theorie ist: Verwenden Sie die gleiche source für alle Pfeile, sondern verändern die targetlat-lons (oder richtiger, lon-lat). Scheint jetzt offensichtlich.

Verwenden Sie auch nicht annotate für Städtenamen. Annotate scheint den Namen an den Anfang des Pfeils und nicht an den Endpunkt zu setzen.

Wie gesagt, ich würde gerne Vorschläge für Verbesserungen (inkl. Für die Etikettierung) begrüßen.

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() 

enter image description here