Si tengo el siguiente código:
import seaborn import matplotlib.pyplot as plt flights = sns.load_dataset("flights") flights = flights.pivot("month", "year", "passengers") f,(ax1,ax2,ax3) = plt.subplots(1,3,sharey=True) g1 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax1) g1.set_ylabel('') g1.set_xlabel('') g2 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax2) g2.set_ylabel('') g2.set_xlabel('') g3 = sns.heatmap(flights,cmap="YlGnBu",ax=ax3) g3.set_ylabel('') g3.set_xlabel('')¿Cómo puedo ajustar las subparcelas para que el eje g3 tenga el mismo ancho que el eje g1, g2? Dado que no he agregado la barra de color a los dos primeros ejes, Seaborn reduce el tercer eje para que toda la figura sea consistente. Esto es comprensible.
Quiero esto:
¿Quizás necesito hacer una trama secundaria de 4 paneles con el cuarto panel que solo contiene la barra de colores?
De hecho, un camino a seguir es crear 4 ejes, donde el cuarto eje contendrá la barra de colores. Puede usar el argumento cbar_ax para decirle al mapa de calor en qué ejes trazar la barra de colores. Para crear los ejes con algunas buenas proporciones, puede usar el argumento gridspec_kw para subplots . Entonces, el problema es que los ejes compartirían la escala y con la barra de colores, por lo que debemos desactivar sharey y compartir manualmente los primeros tres ejes usando ax1.get_shared_y_axes().join(ax2,ax3) . Esto, a su vez, creará etiquetas de eje no deseadas, que deben desactivarse.
import seaborn as sns import matplotlib.pyplot as plt flights = sns.load_dataset("flights") flights = flights.pivot("month", "year", "passengers") f,(ax1,ax2,ax3, axcb) = plt.subplots(1,4, gridspec_kw={'width_ratios':[1,1,1,0.08]}) ax1.get_shared_y_axes().join(ax2,ax3) g1 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax1) g1.set_ylabel('') g1.set_xlabel('') g2 = sns.heatmap(flights,cmap="YlGnBu",cbar=False,ax=ax2) g2.set_ylabel('') g2.set_xlabel('') g2.set_yticks([]) g3 = sns.heatmap(flights,cmap="YlGnBu",ax=ax3, cbar_ax=axcb) g3.set_ylabel('') g3.set_xlabel('') g3.set_yticks([]) # may be needed to rotate the ticklabels correctly: for ax in [g1,g2,g3]: tl = ax.get_xticklabels() ax.set_xticklabels(tl, rotation=90) tly = ax.get_yticklabels() ax.set_yticklabels(tly, rotation=0) plt.show()