Низкий FPS в MatPlotlib - PullRequest
       21

Низкий FPS в MatPlotlib

1 голос
/ 12 января 2020

Столкнувшись с тем, что MatPlotlib при использовании self.frame.canvas.draw () я получил только 12 FPS на простом графике. Я нашел хорошую статью о скорости разгона MatPlotlib: https://bastibe.de/2013-05-30-speeding-up-matplotlib.html Но часть примеров - это рабочий код, но пример с самым быстрым кодом (500 FPS) не работает . Попытки прочитать документацию MatPlotlib еще не привели к успеху в понимании, где ошибка в коде: «AttributeError: draw_artist может использоваться только после первоначального рисования, которое кэширует средство визуализации». Где ошибка в коде?

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

fig, ax = plt.subplots()
line, = ax.plot(np.random.randn(100))
plt.show(block=False)

tstart = time.time()
num_plots = 0
while time.time()-tstart < 5:
    line.set_ydata(np.random.randn(100))
    ax.draw_artist(ax.patch)
    ax.draw_artist(line)
    fig.canvas.update()
    fig.canvas.flush_events()
    num_plots += 1
print(num_plots/5)

1 Ответ

2 голосов
/ 12 января 2020

Если вы используете бэкэнд Qt5Agg, вы действительно можете просто сделать то, что предлагает ошибка, а именно нарисовать холст один раз перед запуском l oop.

import time
import numpy as np
import matplotlib
matplotlib.use("Qt5Agg")
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
line, = ax.plot(np.random.randn(100))

fig.canvas.draw()
plt.show(block=False)


tstart = time.time()
num_plots = 0
while time.time()-tstart < 5:
    line.set_ydata(np.random.randn(100))
    ax.draw_artist(ax.patch)
    ax.draw_artist(line)
    fig.canvas.update()
    fig.canvas.flush_events()
    num_plots += 1
print(num_plots/5)

Однако я бы на самом деле использовал blit вместо обновления PyQt, чтобы оно работало с любым бэкэндом,

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

fig, ax = plt.subplots()
line, = ax.plot(np.random.randn(100))

fig.canvas.draw()
plt.show(block=False)


tstart = time.time()
num_plots = 0
while time.time()-tstart < 5:
    line.set_ydata(np.random.randn(100))
    ax.draw_artist(ax.patch)
    ax.draw_artist(line)
    fig.canvas.blit(ax.bbox)
    fig.canvas.flush_events()
    num_plots += 1
print(num_plots/5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...