Aspecto del contenedor en Matplotlib

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica te guiará a través del proceso de creación de diferentes gráficos utilizando el método set_box_aspect() en Matplotlib. Este método establece la relación de aspecto entre la altura y el ancho de los ejes en unidades físicas, independientemente de los límites de los datos. Es útil para producir gráficos cuadrados, independientemente de los datos que contengan, o para tener un gráfico habitual con las mismas dimensiones de ejes junto a un gráfico de imagen con una relación de aspecto fija (en datos).

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haz clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tengas que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos rápidamente el problema para ti.

Un eje cuadrado, independiente de los datos

Vamos a crear un eje cuadrado, sin importar cuáles sean los límites de los datos.

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()

Subplots compartidos con aspecto cuadrado

Vamos a crear subplots compartidos que tengan un aspecto cuadrado.

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()

Ejes gemelos con aspecto cuadrado

Vamos a crear un eje cuadrado, con un eje gemelo. El eje gemelo adopta el aspecto del contenedor del padre.

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()

Gráfico normal junto a una imagen

Al crear un gráfico de imagen con una relación de aspecto fija de datos y el valor predeterminado adjustable="box" junto a un gráfico normal, los ejes tendrían una altura desigual. set_box_aspect() ofrece una solución fácil a esto al permitir que los ejes del gráfico normal usen las dimensiones de la imagen como relación de aspecto del contenedor. Este ejemplo también muestra que el diseño restringido interactúa perfectamente con una relación de aspecto fija del contenedor.

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()

Gráfico combinado/marginal con aspecto cuadrado

Puede ser deseable mostrar las distribuciones marginales junto a un gráfico de datos combinados. Lo siguiente crea un gráfico cuadrado con la relación de aspecto del contenedor de los ejes marginales igual a las relaciones de ancho y alto del gridspec. Esto asegura que todos los ejes se alineen perfectamente, independientemente del tamaño de la figura.

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()

Relación de aspecto del contenedor para muchos subplots

Es posible pasar la relación de aspecto del contenedor a un Eje durante la inicialización. Lo siguiente crea una cuadrícula de subplots de 2 por 3 con todos los Ejes cuadrados.

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()

Resumen

Esta práctica dio una visión general de cómo usar set_box_aspect() en Matplotlib para crear diferentes tipos de gráficos con una relación de aspecto fija entre la altura y el ancho de los ejes.