如何转换 matplotlib ConnectionPatch,即用于 Cartopy 投影
How do I transform matplotlib ConnectionPatch, i.e for Cartopy projection
问题:我想用matplotlib.patches.ConnectionPatch连接两个轴,其中一个是Cartopy地图投影。
预期:每个轴的两个lat/lon坐标应该用一条线连接起来。
结果: 该线在地图投影中转到 0,0 坐标,而不是定义的 lat/lon.
如果投影是未修改的 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()
您在 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')
情节将是:
虽然之前的回答非常有帮助,但它对我来说在略有不同的不同情况下(使用不同的投影和轴)不起作用。
不过,我没有设法找到会破坏它的 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()
我知道这并非 100% 与 OP 相关,但它确实回答了标题的问题,因此它更像是对 运行 遇到相同(未知)问题的其他人的潜在帮助我遇到了。
问题:我想用matplotlib.patches.ConnectionPatch连接两个轴,其中一个是Cartopy地图投影。
预期:每个轴的两个lat/lon坐标应该用一条线连接起来。
结果: 该线在地图投影中转到 0,0 坐标,而不是定义的 lat/lon.
如果投影是未修改的 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()
您在 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')
情节将是:
虽然之前的回答非常有帮助,但它对我来说在略有不同的不同情况下(使用不同的投影和轴)不起作用。 不过,我没有设法找到会破坏它的 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()
我知道这并非 100% 与 OP 相关,但它确实回答了标题的问题,因此它更像是对 运行 遇到相同(未知)问题的其他人的潜在帮助我遇到了。