簡體   English   中英

如何轉換 matplotlib ConnectionPatch,即用於 Cartopy 投影

[英]How do I transform matplotlib ConnectionPatch, i.e for Cartopy projection

問題:我想使用 matplotlib.patches.ConnectionPatch 連接兩個軸,其中一個是 Cartopy map 投影。

預期:每個軸中的兩個緯度/經度坐標應由一條線連接。

結果:該線在 map 投影中轉到 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()

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

並使用這個到 plot 的連接補丁:

con = patches.ConnectionPatch(
    xyA=xyA, 
    xyB=(lon,lat), 
    coordsA='data', coordsB='data', axesA=ax, axesB=ax2, color='r')

plot 將是:

在此處輸入圖像描述

盡管先前的答案非常有幫助,但對我來說,它在略有不同的不同情況下(使用不同的投影和軸)不起作用。 不過,我沒有設法找到會破壞它的 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()

具有不同投影的兩個地理圖的圖間連接

我知道這與 OP 沒有 100% 的關系,但它確實回答了標題的問題,因此它更旨在為遇到我遇到的相同(未知)問題的其他人提供潛在幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM