"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como acelerar a plotagem do Matplotlib para melhorar o desempenho?

Como acelerar a plotagem do Matplotlib para melhorar o desempenho?

Publicado em 2024-11-06
Navegar:697

How to Speed Up Matplotlib Plotting to Enhance Performance?

Por que o Matplotlib é tão lento?

Ao avaliar as bibliotecas de plotagem do Python, é importante considerar o desempenho. Matplotlib, uma biblioteca amplamente utilizada, pode parecer lenta, levantando questões sobre como acelerá-la ou explorar opções alternativas. Vamos nos aprofundar no problema e explorar possíveis soluções.

O exemplo fornecido mostra um gráfico com vários subtramas e atualizações de dados. Com Matplotlib, esse processo envolve redesenhar tudo, incluindo limites de eixos e rótulos de ticks, resultando em desempenho lento.

Compreendendo os gargalos

Dois fatores principais contribuem para a lentidão:

  1. Redesenho excessivo: A função fig.canvas.draw() do Matplotlib redesenha a figura inteira, mesmo quando apenas uma pequena parte precisa ser atualizada.
  2. Abundantes rótulos de ticks: Um grande número de rótulos de ticks e subtramas pode sobrecarregar significativamente o processo de desenho.

Otimizando com Blitting

Para resolver esses gargalos , considere usar blitting. Blitting envolve atualizar apenas partes específicas da figura, reduzindo o tempo de renderização. No entanto, o código específico do back-end é necessário para uma implementação eficiente, o que pode exigir a incorporação de gráficos Matplotlib em um kit de ferramentas GUI. técnica pode fornecer desempenho razoável sem dependência de back-end:

Capturar plano de fundo:

Antes da animação, capture o plano de fundo de cada subtrama para restaurar mais tarde.

    Atualizar e desenhar:
  1. Para cada quadro, atualize os dados e o artista das linhas, restaurando o fundo e pintando a parte atualizada.
  2. Evite redesenhar:
  3. Use fig.canvas.blit( ax.bbox) em vez de fig.canvas.draw() para atualizar apenas a área necessária.
  4. Exemplo de implementação:
import matplotlib. pyplot como plt importar numpy como np x = np.arange(0, 2*np.pi, 0,1) y = np.sin(x) fig, eixos = plt.subplots(nrows=6) estilos = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-'] def plot(machado, estilo): retornar ax.plot(x, y, estilo, animado=True)[0] linhas = [plot(ax, estilo) para ax, estilo em zip(eixos, estilos)] # Capturar fundo backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) para machado em eixos] para i em xrange(1, 2000): para j, (linha, machado, plano de fundo) em enumerate(zip(linhas, eixos, planos de fundo), start=1): fig.canvas.restore_region(plano de fundo) linha.set_ydata(np.sin(j*x i/10.0)) ax.draw_artist(linha) fig.canvas.blit(ax.bbox)

Módulo de animação

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)

fig, axes = plt.subplots(nrows=6)

styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
    return ax.plot(x, y, style, animated=True)[0]

lines = [plot(ax, style) for ax, style in zip(axes, styles)]

# Capture Background
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]

for i in xrange(1, 2000):
    for j, (line, ax, background) in enumerate(zip(lines, axes, backgrounds), start=1):
        fig.canvas.restore_region(background)
        line.set_ydata(np.sin(j*x   i/10.0))
        ax.draw_artist(line)
        fig.canvas.blit(ax.bbox)

importar matplotlib.pyplot como plt importar matplotlib.animation como animação def animado(i): para j, linha em enumerar(linhas, início=1): linha.set_ydata(np.sin(j*x i/10.0)) ani = animação.FuncAnimation(fig, animate, xrange(1, 200), intervalo=0, blit=True)

Declaração de lançamento Este artigo foi reimpresso em: 1729342040 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3