Desempenho #

Seja explorando dados no modo interativo ou salvando muitos gráficos programaticamente, o desempenho da renderização pode ser um gargalo desafiador em seu pipeline. Matplotlib fornece várias maneiras de reduzir bastante o tempo de renderização ao custo de uma pequena alteração (para uma tolerância configurável) na aparência do seu gráfico. Os métodos disponíveis para reduzir o tempo de renderização dependem do tipo de plotagem que está sendo criado.

Simplificação do segmento de linha #

Para plotagens que possuem segmentos de linha (por exemplo, plotagens de linha típicas, contornos de polígonos, etc.), o desempenho da renderização pode ser controlado por rcParams["path.simplify"](padrão: True) e rcParams["path.simplify_threshold"](padrão: 0.111111111111), que podem ser definidos, por exemplo, no matplotlibrcarquivo (consulte Personalizando o Matplotlib com estilo Sheets e rcParams para mais informações sobre o matplotlibrcarquivo). rcParams["path.simplify"](padrão: True) é um booleano que indica se os segmentos de linha são simplificados ou não. rcParams["path.simplify_threshold"](padrão: 0.111111111111) controla quantos segmentos de linha são simplificados; limites mais altos resultam em renderização mais rápida.

O script a seguir exibirá primeiro os dados sem nenhuma simplificação e, em seguida, exibirá os mesmos dados com simplificação. Tente interagir com 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 atualmente é padronizado para um limite de simplificação conservadora de 1/9. Para alterar as configurações padrão para usar um valor diferente, altere o matplotlibrcarquivo. Como alternativa, os usuários podem criar um novo estilo para plotagem interativa (com simplificação máxima) e outro estilo para plotagem de qualidade de publicação (com simplificação mínima) e ativá-los conforme necessário. Consulte Personalizando Matplotlib com folhas de estilo e rcParams para obter instruções sobre como executar essas ações.

A simplificação funciona mesclando iterativamente segmentos de linha em um único vetor até que a distância perpendicular do próximo segmento de linha ao vetor (medida no espaço de coordenadas de exibição) seja maior que o path.simplify_thresholdparâmetro.

Observação

As alterações relacionadas a como os segmentos de linha são simplificados foram feitas na versão 2.1. O tempo de renderização ainda será aprimorado por esses parâmetros antes da versão 2.1, mas o tempo de renderização para alguns tipos de dados será bastante aprimorado nas versões 2.1 e superiores.

Subamostragem do marcador #

Os marcadores também podem ser simplificados, embora menos robustos do que os segmentos de linha. A subamostragem do marcador está disponível apenas para Line2Dobjetos (através da markeverypropriedade). Onde quer Line2Dque parâmetros de construção sejam passados, como pyplot.plote Axes.plot, o markeveryparâmetro pode ser usado:

plt.plot(x, y, markevery=10)

O markeveryargumento permite a subamostragem ingênua ou uma tentativa de amostragem uniformemente espaçada (ao longo do eixo x ). Consulte a demonstração do Markevery para obter mais informações.

Dividindo linhas em pedaços menores #

Se você estiver usando o back-end Agg (consulte O que é um back-end? ), poderá usar rcParams["agg.path.chunksize"](padrão: 0) Isso permite que os usuários especifiquem um tamanho de bloco e quaisquer linhas com mais vértices serão divididas em várias linhas , cada um dos quais não tem mais do que agg.path.chunksize muitos vértices. (A menos agg.path.chunksizeque seja zero, caso em que não há fragmentação.) Para alguns tipos de dados, agrupar a linha em tamanhos razoáveis ​​pode diminuir muito o tempo de renderização.

O script a seguir exibirá primeiro os dados sem qualquer restrição de tamanho de bloco e, em seguida, exibirá os mesmos dados com um tamanho de bloco de 10.000. A diferença pode ser vista melhor quando as figuras são grandes, tente maximizar a GUI e depois interagir com elas:

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

Legendas #

O comportamento de legenda padrão para eixos tenta encontrar o local que abrange o menor número de pontos de dados ( loc='best'). Isso pode ser um cálculo muito caro se houver muitos pontos de dados. Nesse caso, convém fornecer um local específico.

Usando o estilo rápido #

O estilo rápido pode ser usado para definir automaticamente os parâmetros de simplificação e fragmentação para configurações razoáveis ​​para acelerar a plotagem de grandes quantidades de dados. O seguinte código o executa:

import matplotlib.style as mplstyle
mplstyle.use('fast')

É muito leve, por isso funciona bem com outros estilos. Certifique-se de que o estilo rápido seja aplicado por último para que outros estilos não substituam as configurações:

mplstyle.use(['dark_background', 'ggplot', 'fast'])