В настоящее время я оцениваю различные библиотеки построения графиков Python. Прямо сейчас я пробую matplotlib и очень разочарован производительностью. Следующий пример модифицирован из примеров SciPy и дает мне только ~ 8 кадров в секунду!
Есть ли способы ускорить это или мне следует выбрать другую библиотеку для построения графиков?
from pylab import *
import time
ion()
fig = figure()
ax1 = fig.add_subplot(611)
ax2 = fig.add_subplot(612)
ax3 = fig.add_subplot(613)
ax4 = fig.add_subplot(614)
ax5 = fig.add_subplot(615)
ax6 = fig.add_subplot(616)
x = arange(0,2*pi,0.01)
y = sin(x)
line1, = ax1.plot(x, y, 'r-')
line2, = ax2.plot(x, y, 'g-')
line3, = ax3.plot(x, y, 'y-')
line4, = ax4.plot(x, y, 'm-')
line5, = ax5.plot(x, y, 'k-')
line6, = ax6.plot(x, y, 'p-')
# turn off interactive plotting - speeds things up by 1 Frame / second
plt.ioff()
tstart = time.time() # for profiling
for i in arange(1, 200):
line1.set_ydata(sin(x+i/10.0)) # update the data
line2.set_ydata(sin(2*x+i/10.0))
line3.set_ydata(sin(3*x+i/10.0))
line4.set_ydata(sin(4*x+i/10.0))
line5.set_ydata(sin(5*x+i/10.0))
line6.set_ydata(sin(6*x+i/10.0))
draw() # redraw the canvas
print 'FPS:' , 200/(time.time()-tstart)
python
matplotlib
Мне самому
источник
источник
Ответы:
Во-первых, (хотя это никак не повлияет на производительность) подумайте о том, чтобы очистить свой код, примерно так:
В приведенном выше примере я получаю около 10 кадров в секунду.
Небольшое примечание: в зависимости от конкретного случая использования matplotlib может быть не лучшим выбором. Он ориентирован на показатели качества публикации, а не на отображение в реальном времени.
Однако есть много вещей, которые вы можете сделать, чтобы ускорить этот пример.
Есть две основные причины, по которым это происходит так медленно.
1) Вызов все
fig.canvas.draw()
перерисовывает . Это ваше узкое место. В вашем случае вам не нужно перерисовывать такие вещи, как границы осей, метки и т. Д.2) В вашем случае есть много подзаголовков с множеством меток. На их рисование уходит много времени.
И то, и другое можно исправить с помощью блиттинга.
Чтобы выполнять блиттинг эффективно, вам придется использовать код, специфичный для серверной части. На практике, если вы действительно беспокоитесь о плавной анимации, вы в любом случае обычно встраиваете графики matplotlib в какой-то набор инструментов gui, так что это не большая проблема.
Однако, не зная больше о том, что вы делаете, я не могу вам помочь.
Тем не менее, есть способ сделать это с нейтральным интерфейсом пользователя, который по-прежнему достаточно быстрый.
Это дает мне ~ 200 кадров в секунду.
Чтобы сделать это немного более удобным,
animations
в последних версиях matplotlib есть модуль.Например:
источник
animation
кажется, обновляет график поinterval
периоду времени, что, если я просто хочу обновить его, когда будут готовы новые данные?Matplotlib создает отличную графику для публикации, но не очень хорошо оптимизирован для скорости. Существует множество пакетов для построения графиков Python, которые разработаны с учетом скорости:
[edit: pyqwt больше не поддерживается; предыдущий сопровождающий рекомендует pyqtgraph]
источник
Для начала ответ Джо Кингтона дает очень хороший совет с использованием подхода, нейтрального к графическому интерфейсу, и вы обязательно должны принять его совет (особенно в отношении Blitting) и применить его на практике. Подробнее об этом подходе читайте в Поваренной книге Matplotlib.
Однако подход, не связанный с графическим интерфейсом пользователя (ориентированный на графический интерфейс?), Является ключом к ускорению построения графика. Другими словами, серверная часть чрезвычайно важна для скорости построения.
Поместите эти две строки, прежде чем импортировать что-либо еще из matplotlib:
Конечно, есть разные варианты, которые можно использовать вместо этого
GTKAgg
, но, согласно упомянутой ранее поваренной книге, это был самый быстрый. См. Ссылку о бэкэндах для получения дополнительных опций.источник
Для первого решения, предложенного Джо Кингтоном (.copy_from_bbox & .draw_artist & canvas.blit), мне пришлось снимать фон после строки fig.canvas.draw (), иначе фон не имел никакого эффекта, и я получил тот же результат, что и ты упомянул. Если вы поместите его после fig.show (), он все равно не будет работать, как было предложено Майклом Брауном.
Так что просто поместите фоновую строку после canvas.draw ():
источник
Это может не относиться ко многим из вас, но я обычно работаю на своих компьютерах под Linux, поэтому по умолчанию я сохраняю свои графики matplotlib как PNG и SVG. Это отлично работает под Linux, но невыносимо медленно на моих установках с Windows 7 [MiKTeX под Python (x, y) или Anaconda], поэтому я решил добавить этот код, и там снова все работает нормально:
источник