【问题标题】:Cartopy - multiple arrows using annotateCartopy - 使用注释的多个箭头
【发布时间】:2016-07-11 12:50:22
【问题描述】:

使用this solution 作为基础,是否可以创建从同一源到不同目标的多个箭头?例如德里 -> 北京 (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(),
        )

【问题讨论】:

    标签: cartopy


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多