multiple gridspec_kw add_subplot python matplotlib share axis

python - gridspec_kw - ¿Cómo compartir el eje x de dos subtramas después de que se crean?



subplot python (1)

Estoy tratando de compartir dos ejes de subtramas, 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_axes y _shared_x_axes cuando fig.get_axes() eje de la figura ( fig.get_axes() ) pero no sé cómo vincularlos.


La forma habitual de compartir ejes es crear las propiedades compartidas en 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 lo tanto, compartir los ejes después de que se hayan creado no debería ser necesario.

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 here , 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 enlace entre los dos ejes, ax1 y ax2 . En contraste con el uso compartido en el momento de la creación, deberá desactivar manualmente las etiquetas xtick 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()