使用Basemap时,两个子图之间的线不会在正确的点结束

时间:2017-05-17 09:52:27

标签: python python-3.x matplotlib matplotlib-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()

结果图如下所示:result of the example code

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

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

唯一的解决方法'我发现的问题是相对于地图的中心缩放coord2中的值(记住在我的实际图中有更多的线条),但这是不切实际的,特别是因为如果一切都改变了你改变了数字大小。

对此的任何帮助将不胜感激。

1 个答案:

答案 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()

enter image description here