Ich zeichne zwei Nebenhandlungen mit Matplotlib, im Wesentlichen folgende:

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

Kann ich zwischen diesen beiden Nebenhandlungen Linien ziehen? Wie würde ich das machen?

27
F.X. 9 Juli 2013 im 12:22

3 Antworten

Beste Antwort

Die Lösung aus den anderen Antworten ist in vielen Fällen nicht optimal (da sie nur funktionieren würden, wenn nach der Berechnung der Punkte keine Änderungen am Diagramm vorgenommen würden).

Eine bessere Lösung wäre das speziell entwickelte ConnectionPatch:

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

enter image description here

25
ImportanceOfBeingErnest 19 Mai 2017 im 07:54

Ich bin mir nicht sicher, ob dies genau das ist, wonach Sie suchen, aber ein einfacher Trick, um über Nebenhandlungen hinweg zu zeichnen.

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()
2
Peacefrog 22 Dez. 2016 im 18:12

Sie könnten fig.line verwenden. Es fügt Ihrer Figur eine beliebige Linie hinzu. Figurenlinien sind höher als Achsenlinien, sodass Sie keine Achse zum Zeichnen benötigen.

Dieses Beispiel markiert den gleichen Punkt auf den beiden Achsen. Es ist notwendig, vorsichtig mit dem Koordinatensystem umzugehen, aber die Transformation erledigt die ganze harte Arbeit für Sie.

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

enter image description here

26
jb326 5 Dez. 2016 im 16:33