Python 在Matplotlib中绘制两个绘图之间的直线

Python 在Matplotlib中绘制两个绘图之间的直线,python,matplotlib,Python,Matplotlib,我使用Matplotlib绘制了两个子图,基本上如下所示: subplot(211); imshow(a); scatter(..., ...) subplot(212); imshow(b); scatter(..., ...) 我能在这两个子地块之间划一条线吗?我该怎么做呢?您可以使用fig.line。它可以向您的图形添加任何线。图形线的级别高于轴线,因此您不需要任何轴线来绘制它 此示例在两个轴上标记相同的点。有必要小心使用坐标系,但变换会为您完成所有繁重的工作 import matplo

我使用Matplotlib绘制了两个子图,基本上如下所示:

subplot(211); imshow(a); scatter(..., ...)
subplot(212); imshow(b); scatter(..., ...)

我能在这两个子地块之间划一条线吗?我该怎么做呢?

您可以使用
fig.line
。它可以向您的图形添加任何线。图形线的级别高于轴线,因此您不需要任何轴线来绘制它

此示例在两个轴上标记相同的点。有必要小心使用坐标系,但变换会为您完成所有繁重的工作

import matplotlib.pyplot as plt
import matplotlib
import numpy as np

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')
ax2.plot(x,y,'ko')

i = 10

transFigure = fig.transFigure.inverted()

coord1 = transFigure.transform(ax1.transData.transform([x[i],y[i]]))
coord2 = transFigure.transform(ax2.transData.transform([x[i],y[i]]))


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

ax1.plot(x[i],y[i],'ro',markersize=20)
ax2.plot(x[i],y[i],'ro',markersize=20)


plt.show()

我不确定这是否正是您想要的,但这是一个跨子地块绘制的简单技巧

import matplotlib.pyplot as plt
import numpy as np

ax1=plt.figure(1).add_subplot(211)
ax2=plt.figure(1).add_subplot(212)

x_data=np.linspace(0,10,20)
ax1.plot(x_data, x_data**2,'o')
ax2.plot(x_data, x_data**3, 'o')

ax3 = plt.figure(1).add_subplot(111)
ax3.plot([5,5],[0,1],'--')
ax3.set_xlim([0,10])
ax3.axis("off")
plt.show()

在许多情况下,其他答案的解决方案都是次优的(因为只有在计算点后不对绘图进行任何更改时,它们才会起作用)

更好的解决方案是使用专门设计的:


怀疑您可以使用
注释
来完成此操作。可能最好使用
图线。追加(线)
来避免吹走已经存在的任何内容。非常感谢您的示例,我很难理解Matplotlib转换之前的位置@tcaswell是对的,我只是在
注释上查找了
,而
ConnectorPatch
似乎正是我要找的,所以我会尝试一下,稍后再来!非常好的解决方案。但我用jupyter把线标在了错误的坐标上。解决方案是在调用
transFigure=fig.transFigure.inversed()
之前添加
fig.canvas.draw()
,以便使用正确的坐标。这一点很好。这实际上比以前接受的答案更有效,所以我会接受它。谢谢关于为什么
ax2.add\u artist
ax2
而不是
ax1
github.com/matplotlib/matplotlib/issues/8744上,以及为什么
axesA
设置为
ax2
显然,当使用多个子批
时,我需要使用
fig.add\u artist
,值得一提,否则,它似乎会弄乱
受约束的\u布局
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
import numpy as np

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')
ax2.plot(x,y,'ko')

i = 10
xy = (x[i],y[i])
con = ConnectionPatch(xyA=xy, xyB=xy, coordsA="data", coordsB="data",
                      axesA=ax2, axesB=ax1, color="red")
ax2.add_artist(con)

ax1.plot(x[i],y[i],'ro',markersize=10)
ax2.plot(x[i],y[i],'ro',markersize=10)


plt.show()