¿Cómo compartir el eje x de dos subparcelas después de su creación?

97

Estoy tratando de compartir dos ejes de subparcelas, pero necesito compartir el eje x después de que se creó la figura. Entonces, por ejemplo, creo esta figura:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
plt.plot(t,x)
ax2 = plt.subplot(212)
plt.plot(t,y)

# some code to share both x axis

plt.show()

En lugar del comentario, insertaría un código para compartir ambos ejes x. No encontré ninguna pista de cómo puedo hacer eso. Hay algunos atributos _shared_x_axesy _shared_x_axescuando verifico la figura axis ( fig.get_axes()) pero no sé cómo vincularlos.

mmmx
fuente

Respuestas:

137

La forma habitual de compartir ejes es crear las propiedades compartidas en el momento de la creación. Ya sea

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

o

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

Por tanto, no debería ser necesario compartir los ejes después de su creación.

Sin embargo, si por alguna razón, necesita compartir ejes después de que se hayan creado (en realidad, usar una biblioteca diferente que crea algunas subtramas, como aquí , o compartir un eje insertado podría ser una razón), todavía habría una solución:

Utilizando

ax1.get_shared_x_axes().join(ax1, ax2)

crea un vínculo entre los dos ejes ax1y ax2. A diferencia de compartir en el momento de la creación, tendrá que configurar las xticklabels de forma manual para uno de los ejes (en caso de que lo desee).

Un ejemplo completo:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)

ax1.plot(t,x)
ax2.plot(t,y)

ax1.get_shared_x_axes().join(ax1, ax2)
ax1.set_xticklabels([])
# ax2.autoscale() ## call autoscale if needed

plt.show()
Importancia de ser Ernesto
fuente
La extraña razón, por cierto, es que guardé algunas figuras con pickle y las recargo con otro programa que pierde la propiedad sharex.
ymmx
4
Esto es útil para conectar subparcelas seleccionadas. Por ejemplo, una figura con 4 subtramas: dos series de tiempo y dos histogramas. Esto le permite vincular selectivamente la serie temporal.
Hamid
2
Documentos de
michaelosthege
3
Ohh, acabo de descubrir cómo dejar de compartir un eje (que puede ser útil en una cuadrícula grande); en ese eje, hazlo g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. ¡Gracias por el punto de partida!
naught101
3
@ naught101 Puedes llamar ax2.autoscale().
ImportanceOfBeingErnest