我一直在尝试创建一个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
,但这并不奏效。
唯一的解决方法'我发现的问题是相对于地图的中心缩放coord2
中的值(记住在我的实际图中有更多的线条),但这是不切实际的,特别是因为如果一切都改变了你改变了数字大小。
对此的任何帮助将不胜感激。
答案 0 :(得分:1)
连接不同轴与线连接的问题的解决方案在许多方面并不是最佳的。因此,我在这个问题上添加了another solution。
使用ConnectionPatch
可以更容易地连接不同的子图,即使它们没有相同的方面,或者它们在创建后被转换。
fllowing应该按预期工作:
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()