为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2023-02-15 16:53:09
问题:我想使用 matplotlib.patches.ConnectionPatch 连接两个轴,其中一个是 Cartopy 地图投影。预期:每个轴中的两个纬度/经度坐标应由一条线连接。结果:线转到地图投影中的 0,0 坐标,而不是定义的纬度/经度。如果投影是未修改的 cartopy.crs.PlateCarree(),它确实会按预期工作,但任何其他投影(例如 Robinson())或具有备用 central_longitude 的投影不会。代码:import matplotlib.pyplot as pltimport matplotlib.patches as patchesimport cartopy.crs as ccrsplt.close('all')fig = plt.figure()ax = plt.subplot(projection=ccrs.Robinson())lon,lat = 145,-30ax.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 axescon = patches.ConnectionPatch(    xyA=(lon,lat),     xyB=(lon,lat),     coordsA='data', coordsB='data', axesA=ax, axesB=ax2, color='r')ax2.add_artist(con)plt.show()
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

您在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')

情节将是:

//img1.sycdn.imooc.com//63ec9d99000111ea06340378.jpg

查看完整回答
反对 回复 2023-02-15
?
largeQ

TA贡献2039条经验 获得超7个赞

尽管之前的答案非常有帮助,但它对我来说在略有不同的不同情况下不起作用(使用不同的投影和轴)。不过,我没有设法找到会破坏它的 MWE,所以我真的不知道问题出在哪里,但如果它也对其他人造成破坏,这里有一个适用于所有情况的版本。


import matplotlib.pyplot as plt

import matplotlib.patches as patches

import cartopy.crs as ccrs


fig = plt.figure()


projA = ccrs.Robinson()

projB = ccrs.Mollweide()


pc = ccrs.PlateCarree()


ax = plt.subplot(projection=projA)


lon,lat = 145,-30


ax.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 axes

con = patches.ConnectionPatch(

    xyA=xyA, xyB=xyB, coordsA=ax.transData, coordsB=ax2.transData, color='r')


fig.add_artist(con)


plt.show()

//img1.sycdn.imooc.com//63ec9da90001208705100360.jpg

我知道这不是 100% 与 OP 相关,但它确实回答了标题的问题,因此它更像是对遇到我遇到的相同(未知)问题的其他人的潜在帮助。



查看完整回答
反对 回复 2023-02-15
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信