使用底图时,两个子图之间的线没有在正确的点结束

line between two subplots does not end at the correct point when using Basemap

我一直在尝试创建一个由几个子图组成的 matplotlib 图形,其中一个是用 Basemap 绘制的地图。现在,按照 this question 中接受的答案,我试图在每个正常子图中的给定点与 Basemap 绘制的地图中的相应坐标之间画一条线。这是我的代码的精简版本:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from mpl_toolkits.basemap import Basemap

fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

x,y = np.random.rand(100),np.random.rand(100)

ax1.plot(x,y,'ko')

map = Basemap(ax = ax2)

map.drawcoastlines()
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')


i = 10
xl,yl = x[i],y[i]

lon = 24
lat = 60

xr,yr = map(lon,lat)

transFigure = fig.transFigure.inverted()

coord1 = transFigure.transform(ax1.transData.transform([xl,yl]))
coord2 = transFigure.transform(ax2.transData.transform([xr,yr]))


line = matplotlib.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),
                               transform=fig.transFigure)
fig.lines = line,

ax1.plot(xl,yl,'ro',markersize=10)
ax2.plot(xr,yr,'ro',markersize=10)


plt.show()

结果图如下所示:

如您所见,就像在原始示例中一样,我在左侧散点图和 Basemap 地图(大致是赫尔辛基的位置)中都画了一个红点,以及一条连接两者的线点。但是在散点图中,线在正确的位置结束,而在地图一侧,线偏离了。

我猜这与子图的缩放比例有关,以保持地图的纵横比不变(颜色条也会影响,线条关闭的程度)。我可能只是使用了错误的 transform,但到目前为止我还没有弄明白。我一直在尝试使用 map.transform,但没有用。

我发现的唯一 'fix' 问题是相对于地图中心缩放 coord2 中的值(记住在我的真实图中有更多的线) , 但这是相当不切实际的,特别是因为如果你改变图形大小,一切都会改变。

如有任何帮助,我们将不胜感激。

链接问题中用一条线连接不同轴的解决方案在很多方面都不是最优的。因此,我在该问题中添加了 another solution

使用 ConnectionPatch 可以更轻松地连接不同的子图,即使它们不具有相同的方面或者在创建后进行了转换。

下面应该按预期工作:

import matplotlib.pyplot as plt

import numpy as np
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import ConnectionPatch

fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

x,y = np.random.rand(100),np.random.rand(100)

ax1.plot(x,y,'ko')

map = Basemap(ax = ax2)

map.drawcoastlines()
map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')


i = 10
xl,yl = x[i],y[i]

lon = 24
lat = 60

xr,yr = map(lon,lat)

con = ConnectionPatch(xyA=[xr,yr], xyB=[xl,yl], coordsA="data", coordsB="data",
                      axesA=ax2, axesB=ax1, color="red")
ax2.add_artist(con)

ax1.plot(xl,yl,'ro',markersize=10)
ax2.plot(xr,yr,'ro',markersize=10)


plt.show()