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π).

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

x = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y = np.sinc(x)

fig, ax = plt.subplots()
ax.plot(x, y)
auto escala
[<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)
auto escala

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 xo y, pero la interfaz posicional y de palabras clave no se puede combinar.

auto escala

Bordes adhesivos #

Hay elementos de trama ( Artists) 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.

xx, yy = np.meshgrid(x, x)
zz = np.sinc(np.sqrt((xx - 1)**2 + (yy - 1)**2))

fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].imshow(zz)
ax[0].set_title("default margins")
ax[1].imshow(zz)
ax[1].margins(0.2)
ax[1].set_title("margins(0.2)")
márgenes predeterminados, márgenes (0.2)
Text(0.5, 1.0, 'margins(0.2)')

Esta anulación de los márgenes está determinada por "bordes pegajosos", una propiedad de Artistla 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_edgesy los valores de los bordes adhesivos se pueden cambiar escribiendo en Artist.sticky_edges.xo 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)")
márgenes predeterminados use_sticky_edges (0.2), use_sticky_edges=Márgenes falsos (0.2), márgenes predeterminados use_sticky_edges (-0.2)
Text(0.5, 1.0, 'default use_sticky_edges\nmargins(-0.2)')

Podemos ver que la configuración use_sticky_edgesen 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:

fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].plot(x, y)
ax[0].set_title("Single curve")
ax[1].plot(x, y)
ax[1].plot(x * 2.0, y)
ax[1].set_title("Two curves")
Curva simple, dos curvas
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 xlimpersiste incluso si agregamos más curvas a los datos. Para volver a calcular los nuevos límites, las llamadas Axes.autoscalealternará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()")
set_xlim(izquierda=-1, derecha=1) , set_xlim(izquierda=-1, derecha=1) escala automática()
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 enabley axisestablece 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, tightpuede establecer el opuesto en Ninguno , de esa manera no debe modificarse. Sin embargo, establecer enableen Ninguno y ajustar en Verdadero afecta a ambos ejes independientemente del axisargumento.

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())
auto escala
(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()
auto escala

Tiempo total de ejecución del script: (0 minutos 6.508 segundos)

Galería generada por Sphinx-Gallery