web-dev-qa-db-fra.com

Tracer des lignes entre deux parcelles dans Matplotlib

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?

22
F.X.

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

 enter image description here

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

enter image description here

24
Pablo

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