Nota
Haga clic aquí para descargar el código de ejemplo completo
Autoescalado #
Los límites de un eje se pueden establecer manualmente (p. ej .) o Matplotlib puede establecerlos automáticamente en función de los datos que ya se encuentran en los ejes. Hay una serie de opciones para este comportamiento de escalado automático, que se analizan a continuación.ax.set_xlim(xmin, xmax)
Comenzaremos con un diagrama de línea simple que muestra que el ajuste de escala automático extiende los límites del eje un 5 % más allá de los límites de los datos (-2π, 2π).
[<matplotlib.lines.Line2D object at 0x7f2cde5343a0>]
Márgenes #
El margen predeterminado alrededor de los límites de datos es del 5%:
(0.05, 0.05)
Los márgenes se pueden hacer más grandes usando margins
:
fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(0.2, 0.2)
En general, los márgenes pueden estar en el rango (-0,5, ∞), donde los márgenes negativos establecen los límites de los ejes en un subrango del rango de datos, es decir, recortan los datos. El uso de un solo número para los márgenes afecta a ambos ejes, un solo margen se puede personalizar usando argumentos de palabra clave x
o y
, pero la interfaz posicional y de palabras clave no se puede combinar.
fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(y=-0.2)
Bordes adhesivos #
Hay elementos de trama ( Artist
s) que generalmente se usan sin márgenes. Por ejemplo, las imágenes en falso color (por ejemplo, creadas con Axes.imshow
) no se consideran en el cálculo de los márgenes.
Text(0.5, 1.0, 'margins(0.2)')
Esta anulación de los márgenes está determinada por "bordes pegajosos", una propiedad de Artist
la clase que puede suprimir la adición de márgenes a los límites de los ejes. El efecto de los bordes adhesivos se puede desactivar en un eje cambiando
use_sticky_edges
. Los artistas tienen una propiedad Artist.sticky_edges
y los valores de los bordes adhesivos se pueden cambiar escribiendo en Artist.sticky_edges.x
o
Artist.sticky_edges.y
.
El siguiente ejemplo muestra cómo funciona la anulación y cuándo es necesaria.
fig, ax = plt.subplots(ncols=3, figsize=(16, 10))
ax[0].imshow(zz)
ax[0].margins(0.2)
ax[0].set_title("default use_sticky_edges\nmargins(0.2)")
ax[1].imshow(zz)
ax[1].margins(0.2)
ax[1].use_sticky_edges = False
ax[1].set_title("use_sticky_edges=False\nmargins(0.2)")
ax[2].imshow(zz)
ax[2].margins(-0.2)
ax[2].set_title("default use_sticky_edges\nmargins(-0.2)")
Text(0.5, 1.0, 'default use_sticky_edges\nmargins(-0.2)')
Podemos ver que la configuración use_sticky_edges
en Falso representa la imagen con los márgenes solicitados.
Si bien los bordes adhesivos no aumentan los límites del eje a través de márgenes adicionales, los márgenes negativos aún se tienen en cuenta. Esto se puede ver en los límites reducidos de la tercera imagen.
Control de escala automática #
De forma predeterminada, los límites se recalculan cada vez que agrega una nueva curva al gráfico:
Text(0.5, 1.0, 'Two curves')
Sin embargo, hay casos en los que no desea ajustar automáticamente la ventana gráfica a nuevos datos.
Una forma de deshabilitar el ajuste de escala automático es establecer manualmente el límite del eje. Digamos que queremos ver solo una parte de los datos con mayor detalle. La configuración xlim
persiste incluso si agregamos más curvas a los datos. Para volver a calcular los nuevos límites, las llamadas Axes.autoscale
alternarán la funcionalidad manualmente.
fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].plot(x, y)
ax[0].set_xlim(left=-1, right=1)
ax[0].plot(x + np.pi * 0.5, y)
ax[0].set_title("set_xlim(left=-1, right=1)\n")
ax[1].plot(x, y)
ax[1].set_xlim(left=-1, right=1)
ax[1].plot(x + np.pi * 0.5, y)
ax[1].autoscale()
ax[1].set_title("set_xlim(left=-1, right=1)\nautoscale()")
Text(0.5, 1.0, 'set_xlim(left=-1, right=1)\nautoscale()')
Podemos comprobar que el primer gráfico tiene desactivado el autoescala y que el segundo gráfico lo tiene activado de nuevo usando Axes.get_autoscale_on()
:
print(ax[0].get_autoscale_on()) # False means disabled
print(ax[1].get_autoscale_on()) # True means enabled -> recalculated
False
True
Los argumentos de la función de autoescala nos dan un control preciso sobre el proceso de autoescala. Una combinación de argumentos enable
y axis
establece la función de ajuste de escala automático para el eje seleccionado (o ambos). El argumento tight
establece el margen del eje seleccionado en cero. Para conservar la configuración de cualquiera de los dos
enable
, tight
puede establecer el opuesto en Ninguno , de esa manera no debe modificarse. Sin embargo, establecer enable
en Ninguno y ajustar en Verdadero afecta a ambos ejes independientemente del axis
argumento.
fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(0.2, 0.2)
ax.autoscale(enable=None, axis="x", tight=True)
print(ax.margins())
(0, 0)
Trabajando con colecciones #
La escala automática funciona de manera inmediata para todas las líneas, parches e imágenes agregadas a los ejes. Uno de los artistas con los que no funcionará es un Collection
. Después de agregar una colección a los ejes, se debe activar manualmente
autoscale_view()
para recalcular los límites de los ejes.
fig, ax = plt.subplots()
collection = mpl.collections.StarPolygonCollection(
5, rotation=0, sizes=(250,), # five point star, zero angle, size 250px
offsets=np.column_stack([x, y]), # Set the positions
offset_transform=ax.transData, # Propagate transformations of the Axes
)
ax.add_collection(collection)
ax.autoscale_view()
Tiempo total de ejecución del script: (0 minutos 6.508 segundos)