Rendimiento #
Ya sea que explore datos en modo interactivo o guarde muchos gráficos mediante programación, el rendimiento de la representación puede ser un cuello de botella desafiante en su canalización. Matplotlib proporciona múltiples formas de reducir en gran medida el tiempo de renderizado a costa de un ligero cambio (a una tolerancia configurable) en la apariencia de su gráfico. Los métodos disponibles para reducir el tiempo de renderizado dependen del tipo de gráfico que se esté creando.
Simplificación de segmento de línea #
Para gráficos que tienen segmentos de línea (p. ej., gráficos de línea típicos, contornos de polígonos, etc.), el rendimiento de representación se puede controlar mediante
rcParams["path.simplify"]
(predeterminado: True
) y rcParams["path.simplify_threshold"]
(predeterminado: 0.111111111111
), que se pueden definir, por ejemplo, en el matplotlibrc
archivo (consulte
Personalización de Matplotlib con estilo sheets y rcParams para obtener más información sobre el matplotlibrc
archivo). rcParams["path.simplify"]
(predeterminado: True
) es un booleano que indica si los segmentos de línea se simplifican o no.
rcParams["path.simplify_threshold"]
(predeterminado: 0.111111111111
) controla cuánto se simplifican los segmentos de línea; los umbrales más altos dan como resultado una representación más rápida.
El siguiente script primero mostrará los datos sin ninguna simplificación y luego mostrará los mismos datos con simplificación. Intenta interactuar con ambos:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()
mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()
Matplotlib actualmente tiene por defecto un umbral de simplificación conservador de 1/9
. Para cambiar la configuración predeterminada para usar un valor diferente, cambie el matplotlibrc
archivo. Como alternativa, los usuarios pueden crear un nuevo estilo para el trazado interactivo (con la máxima simplificación) y otro estilo para el trazado con calidad de publicación (con la mínima simplificación) y activarlos según sea necesario. Consulte
Personalización de Matplotlib con hojas de estilo y rcParams para obtener instrucciones sobre cómo realizar estas acciones.
La simplificación funciona mediante la combinación iterativa de segmentos de línea en un solo vector hasta que la distancia perpendicular del siguiente segmento de línea al vector (medida en el espacio de coordenadas de visualización) sea mayor que el path.simplify_threshold
parámetro.
Nota
Los cambios relacionados con la forma en que se simplifican los segmentos de línea se realizaron en la versión 2.1. El tiempo de representación seguirá mejorando con estos parámetros antes de la 2.1, pero el tiempo de representación para algunos tipos de datos mejorará enormemente en las versiones 2.1 y posteriores.
Submuestreo de marcador #
Los marcadores también se pueden simplificar, aunque de manera menos robusta que los segmentos de línea. El submuestreo de marcador solo está disponible para Line2D
objetos (a través de la markevery
propiedad). Dondequiera Line2D
que se pasen parámetros de construcción, como pyplot.plot
y Axes.plot
, el markevery
parámetro se puede usar:
plt.plot(x, y, markevery=10)
El markevery
argumento permite un submuestreo ingenuo o un intento de muestreo uniformemente espaciado (a lo largo del eje x ). Consulte la
demostración de Markevery
para obtener más información.
Dividir líneas en partes más pequeñas #
Si está utilizando el backend Agg (vea ¿Qué es un backend? ), entonces puede usar rcParams["agg.path.chunksize"]
(predeterminado: 0
) Esto permite a los usuarios especificar un tamaño de fragmento, y cualquier línea con más de ese número de vértices se dividirá en varias líneas , cada uno de los cuales no tiene más que agg.path.chunksize
muchos vértices. (A menos agg.path.chunksize
que sea cero, en cuyo caso no hay fragmentación). Para algunos tipos de datos, la fragmentación de la línea en tamaños razonables puede reducir considerablemente el tiempo de procesamiento.
El siguiente script primero mostrará los datos sin ninguna restricción de tamaño de fragmento y luego mostrará los mismos datos con un tamaño de fragmento de 10,000. La diferencia se puede ver mejor cuando las cifras son grandes, intente maximizar la GUI y luego interactuar con ellas:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 1.0
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['agg.path.chunksize'] = 0
plt.plot(y)
plt.show()
mpl.rcParams['agg.path.chunksize'] = 10000
plt.plot(y)
plt.show()
Leyendas #
El comportamiento predeterminado de la leyenda para los ejes intenta encontrar la ubicación que cubre la menor cantidad de puntos de datos ( loc='best'
). Esto puede ser un cálculo muy costoso si hay muchos puntos de datos. En este caso, es posible que desee proporcionar una ubicación específica.
Usando el estilo rápido #
El estilo rápido se puede usar para establecer automáticamente los parámetros de simplificación y fragmentación en configuraciones razonables para acelerar el trazado de grandes cantidades de datos. El siguiente código lo ejecuta:
import matplotlib.style as mplstyle
mplstyle.use('fast')
Es muy ligero, por lo que funciona bien con otros estilos. Asegúrese de que el estilo rápido se aplique en último lugar para que otros estilos no sobrescriban la configuración:
mplstyle.use(['dark_background', 'ggplot', 'fast'])