tutorial libreria instalar español python matplotlib

libreria - plot() python



Cómo sharex al usar subplot2grid (2)

Soy un usuario de Matlab recientemente convertido a Python. La mayoría de las habilidades de Python las manejo por mi cuenta, pero con la conspiración he golpeado la pared y necesito ayuda.

Esto es lo que estoy tratando de hacer ...

Necesito hacer una figura que consta de 3 subparcelas con las siguientes propiedades:

  • diseño de subparcela es 311, 312, 313
  • La altura de 312 y 313 es aproximadamente la mitad de las 311.
  • todas las subparcelas comparten el eje X común
  • el espacio entre las subparcelas es 0 (se tocan entre sí en el eje X)

Por cierto, sé cómo hacer todo esto, pero no en una sola figura. Ese es el problema que estoy enfrentando ahora.

Por ejemplo, este es mi diseño de subplot ideal:

import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.exp(-t) s3 = s1*s2 fig = plt.figure() ax1 = plt.subplot2grid((4,3), (0,0), colspan=3, rowspan=2) ax2 = plt.subplot2grid((4,3), (2,0), colspan=3) ax3 = plt.subplot2grid((4,3), (3,0), colspan=3) ax1.plot(t,s1) ax2.plot(t[:150],s2[:150]) ax3.plot(t[30:],s3[30:]) plt.tight_layout() plt.show()

Observe cómo el eje x de diferentes subparcelas no está alineado. No sé cómo alinear el eje x en esta figura, pero si hago algo como esto:

import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.exp(-t) s3 = s1*s2 fig2, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1, sharex=True) ax1.plot(t,s1) ax2.plot(t[:150],s2[:150]) ax3.plot(t[30:],s3[30:]) plt.tight_layout() plt.show()

Ahora el eje x está alineado entre las subparcelas, pero todas las subparcelas son del mismo tamaño (que no es lo que quiero)

Además, me gustaría que las subparcelas se toquen en el eje x así:

import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.exp(-t) s3 = s1*s2 fig1 = plt.figure() plt.subplots_adjust(hspace=0) ax1 = plt.subplot(311) ax2 = plt.subplot(312, sharex=ax1) ax3 = plt.subplot(313, sharex=ax1) ax1.plot(t,s1) ax2.plot(t[:150],s2[:150]) ax3.plot(t[30:],s3[30:]) xticklabels = ax1.get_xticklabels()+ax2.get_xticklabels() plt.setp(xticklabels, visible=False) plt.show()

Así que para reformular mi pregunta:

Me gustaria usar

plt.subplot2grid(..., colspan=3, rowspan=2) plt.subplots(..., sharex=True) plt.subplots_adjust(hspace=0)

y

plt.tight_layout()

juntos en la misma figura. ¿Como hacer eso?


Simplemente especifique sharex=ax1 cuando cree su segunda y tercera sharex=ax1 secundaria.

import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.exp(-t) s3 = s1*s2 fig = plt.figure() ax1 = plt.subplot2grid((4,3), (0,0), colspan=3, rowspan=2) ax2 = plt.subplot2grid((4,3), (2,0), colspan=3, sharex=ax1) ax3 = plt.subplot2grid((4,3), (3,0), colspan=3, sharex=ax1) ax1.plot(t,s1) ax2.plot(t[:150],s2[:150]) ax3.plot(t[30:],s3[30:]) fig.subplots_adjust(hspace=0) for ax in [ax1, ax2]: plt.setp(ax.get_xticklabels(), visible=False) # The y-ticks will overlap with "hspace=0", so we''ll hide the bottom tick ax.set_yticks(ax.get_yticks()[1:]) plt.show()

Si aún no sabes qué usar fig.tight_layout() , deberás llamarlo antes de fig.subplots_adjust(hspace=0) . La razón de esto es que tight_layout funciona calculando automáticamente los parámetros para subplots_adjust y luego llamándolo, así que si subplots_adjust se llama manualmente primero, cualquier cosa en la primera llamada será anulada por tight_layout .

P.ej

fig.tight_layout() fig.subplots_adjust(hspace=0)


Una posible solución es crear manualmente el eje utilizando el método add_axis como se muestra here :

import numpy as np import matplotlib.pyplot as plt t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.exp(-t) s3 = s1*s2 left, width = 0.1, 0.8 rect1 = [left, 0.5, width, 0.4] rect2 = [left, 0.3, width, 0.15] rect3 = [left, 0.1, width, 0.15] fig = plt.figure() ax1 = fig.add_axes(rect1) #left, bottom, width, height ax2 = fig.add_axes(rect2, sharex=ax1) ax3 = fig.add_axes(rect3, sharex=ax1) ax1.plot(t,s1) ax2.plot(t[:150],s2[:150]) ax3.plot(t[30:],s3[30:]) # hide labels for label1,label2 in zip(ax1.get_xticklabels(),ax2.get_xticklabels()): label1.set_visible(False) label2.set_visible(False) plt.show()

Pero de esta manera no puede usar tight_layout ya que explícitamente define el tamaño de cada eje.