python - outside - Dibujando líneas entre dos parcelas en Matplotlib.
python graficos 2d (3)
La solución de las otras respuestas es subóptima en muchos casos (ya que solo funcionaría si no se realizan cambios en la gráfica después de calcular los puntos).
Una mejor solución utilizaría el ConnectionPatch
especialmente diseñado:
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()
Estoy dibujando dos subparcelas con Matplotlib, esencialmente siguiendo:
subplot(211); imshow(a); scatter(..., ...)
subplot(212); imshow(b); scatter(..., ...)
¿Puedo trazar líneas entre esas dos subparcelas? ¿Como podría hacerlo?
No estoy seguro de si esto es exactamente lo que está buscando, pero es un truco sencillo para trazar en las subparcelas.
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()
Podrías usar fig.line
. Añade cualquier línea a tu figura. Las líneas de la figura son más altas que las líneas de los ejes, por lo que no necesita ningún eje para dibujarla.
Este ejemplo marca el mismo punto en los dos ejes. Es necesario tener cuidado con el sistema de coordenadas, pero la transformación hace todo el trabajo por usted.
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()