Je dessine deux sous-parcelles avec Matplotlib, essentiellement les suivantes:
subplot(211); imshow(a); scatter(..., ...)
subplot(212); imshow(b); scatter(..., ...)
Puis-je tracer des lignes entre ces deux intrigues secondaires? Comment je ferais ça?
La solution des autres réponses est souvent sous-optimale (car elles ne fonctionneraient que si aucune modification n’est apportée au tracé après le calcul des points).
Une meilleure solution utiliserait le ConnectionPatch
: spécialement conç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()
Vous pouvez utiliser fig.line
. Il ajoute n'importe quelle ligne à votre silhouette. Les lignes de figure ont un niveau supérieur aux lignes d'axe, vous n'avez donc besoin d'aucun axe pour la dessiner.
Cet exemple marque le même point sur les deux axes. Il faut être prudent avec le système de coordonnées, mais la transformation fait tout le travail pour vous.
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()
Je ne sais pas si c'est exactement ce que vous recherchez, mais une astuce simple pour tracer des intrigues secondaires.
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()