如何转换 matplotlib ConnectionPatch,即用于 Cartopy 投影

问题:我想使用 matplotlib.patches.ConnectionPatch 连接两个轴,其中一个是 Cartopy 地图投影。


预期:每个轴中的两个纬度/经度坐标应由一条线连接。


结果:线转到地图投影中的 0,0 坐标,而不是定义的纬度/经度。


如果投影是未修改的 cartopy.crs.PlateCarree(),它确实会按预期工作,但任何其他投影(例如 Robinson())或具有备用 central_longitude 的投影不会。


代码:


import matplotlib.pyplot as plt

import matplotlib.patches as patches

import cartopy.crs as ccrs


plt.close('all')

fig = plt.figure()

ax = plt.subplot(projection=ccrs.Robinson())


lon,lat = 145,-30


ax.stock_img()

ax.plot(lon,lat, marker='x', color='r', transform=ccrs.PlateCarree())


ax2 = fig.add_axes([0.1,0.06,0.8,0.1])

ax2.plot(lon,lat,marker='x', color='r')


# line between axes

con = patches.ConnectionPatch(

    xyA=(lon,lat), 

    xyB=(lon,lat), 

    coordsA='data', coordsB='data', axesA=ax, axesB=ax2, color='r')

ax2.add_artist(con)


plt.show()

http://img2.mukewang.com/63ec9d8a000137bb06550435.jpg

慕森王
浏览 124回答 2
2回答

aluckdog

您在xyA=(lon,lat). 它与声明不符coordsA='data'。要获得正确的值,请执行以下步骤:use_proj = ccrs.Robinson()xyA = use_proj.transform_point(lon, lat, ccrs.PlateCarree())# You get xyA=(13151177.842976002, -3208556.0608129553)并用它来绘制连接补丁:con = patches.ConnectionPatch(    xyA=xyA,     xyB=(lon,lat),     coordsA='data', coordsB='data', axesA=ax, axesB=ax2, color='r')情节将是:

largeQ

尽管之前的答案非常有帮助,但它对我来说在略有不同的不同情况下不起作用(使用不同的投影和轴)。不过,我没有设法找到会破坏它的 MWE,所以我真的不知道问题出在哪里,但如果它也对其他人造成破坏,这里有一个适用于所有情况的版本。import matplotlib.pyplot as pltimport matplotlib.patches as patchesimport cartopy.crs as ccrsfig = plt.figure()projA = ccrs.Robinson()projB = ccrs.Mollweide()pc = ccrs.PlateCarree()ax = plt.subplot(projection=projA)lon,lat = 145,-30ax.stock_img()ax.plot(lon,lat, marker='x', color='r', transform=pc)ax2 = fig.add_axes([0.1,0.06,0.8,0.1], projection=projB)ax2.stock_img()ax2.plot(lon,lat, marker='x', color='r', transform=pc)xyA = projA.transform_point(lon, lat, pc)xyB = projB.transform_point(lon, lat, pc)# line between axescon = patches.ConnectionPatch(    xyA=xyA, xyB=xyB, coordsA=ax.transData, coordsB=ax2.transData, color='r')fig.add_artist(con)plt.show()我知道这不是 100% 与 OP 相关,但它确实回答了标题的问题,因此它更像是对遇到我遇到的相同(未知)问题的其他人的潜在帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python