Skip to main content
 首页 » 编程设计

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

2025年02月15日37java哥

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

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 map (大致是赫尔辛基的位置)中都画了一个红点,以及一条连接两点。但是在散点图中,线在正确的位置结束,而在 map 一侧,线偏离了。

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

我发现问题的唯一“修复”是相对于 map 中心缩放 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()