Estoy tratando de compartir dos ejes de subparcelas, pero necesito compartir el eje x después de crear 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 algún 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 verifico el 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 el momento de la creación. O
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, no debería ser necesario compartir los ejes después de que se hayan creado.
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 subparcelas, como esta podría ser una razón), aún habría una solución:
Utilizando
ax1.get_shared_x_axes().join(ax1, ax2) crea un vínculo entre los dos ejes, ax1 y ax2 . En contraste con el uso compartido en el momento de la creación, deberá configurar xticklabels manualmente para uno de los ejes (en caso de que así 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()La otra respuesta tiene un código para tratar con una lista de ejes :
axes[0].get_shared_x_axes().join(axes[0], *axes[1:])Solo para agregar a la respuesta anterior de ImportanceOfBeingErnest:
Si tiene una list completa de objetos de ejes, puede pasarlos todos a la vez y compartir sus ejes descomprimiendo la lista de la siguiente manera:
ax_list = [ax1, ax2, ... axn] #< your axes objects ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list) Lo anterior los vinculará a todos juntos. Por supuesto, puede ser creativo y crear subconjuntos de su list para vincular solo algunos de ellos.
Nota:
Para tener todos los axes vinculados entre sí, debe incluir el primer elemento de axes_list en la llamada, ¡a pesar de que está invocando .get_shared_x_axes() en el primer elemento para comenzar!
Así que haciendo esto, que sin duda parecería lógico:
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list[1:]) ... dará como resultado la vinculación de todos los objetos de los axes , excepto el primero, que permanecerá completamente independiente de los demás.