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 matplotlibrc
arquivo (consulte
Personalizando o Matplotlib com estilo Sheets e rcParams para mais informações sobre o matplotlibrc
arquivo). 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 matplotlibrc
arquivo. 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_threshold
parâ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 Line2D
objetos (através da markevery
propriedade). Onde quer Line2D
que parâmetros de construção sejam passados, como pyplot.plot
e Axes.plot
, o markevery
parâmetro pode ser usado:
plt.plot(x, y, markevery=10)
O markevery
argumento 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.chunksize
que 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'])