LINUX.ORG.RU

Чем в PyQt без тормозов рисовать перегруженные графики?

 , ,


2

3

Пишу на pyqt свой велосипед для обработки данных. Графики рисую по привычке через matplotlib (qt5agg). Проблема в том, что при отрисовке графиков с большим количеством (порядка нескольких миллионов) точек matplotlib аццки жрёт память и эпически тормозит на любом железе. Теоретически, можно извернуться с даунсемплингом и перерисовкой при смене масштаба, но это большой геморрой. Есть ли для таких задач более подходящие инструменты, позволяющие рисовать в pyqt графики быстро и без лишнего бойлерплейта?

★★★★★

Последнее исправление: Axon (всего исправлений: 1)

Давно не тыкал, но для графиков пользовались qwt (правда, писалось всё на плюсах). Возможно, получится использовать и из питона.

ksv
()
Ответ на: комментарий от anonymous

i5-6600K, 32гига. Впрочем, вопрос не в этом.

Axon ★★★★★
() автор топика
Ответ на: комментарий от ksv

А оно не подавится большими массивами? Обновлять содержимое графика без перерисовки позволяет?

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

Обновлять содержимое графика без перерисовки позволяет?

Нет. Емнип, это ограничение Qt начиная с 4 - надо стирать всё окно и рисовать заново.

d_a ★★★★★
()
Ответ на: комментарий от d_a

Емнип, это ограничение Qt начиная с 4 - надо стирать всё окно и рисовать заново.

Matplotlib использует qt5 в качестве бекенда, и он это умеет. Впрочем, про qwt вопрос не актуален, потому что оно, похоже, только под второй питон.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

Данных точно было много. По поводу отзывчивости интерфейса - не могу помочь, в проекте мало участвовал. Точно помню что у нас пересчёт занимал много времени (не меньше минуты), тормоза в перерисовке могли и не замечать.

ksv
()

Быстро отрисовать несколько миллионов? Ну хз. Разве что рукми распараллеливать отрисовку или какой-нибудь CUDA использовать. По-моему в реализации все таки проще сделать даунсемплинг.

Aswed ★★★★★
()
Ответ на: комментарий от RazrFalcon

А что, починили уже? Когда я писал (давно) гуи с графиками, стереть и перерисовать часть было нельзя. Сейчас не найду, а тогда гуглилось что из это из-за ограничений Qt4 (каких-то флагов пейнтера не было, а в Qt3 было всё збс).

d_a ★★★★★
()
Ответ на: комментарий от Aswed

Но ведь если я могу руками рассчитать до скольки можно даунсемплить датасет в зависимости от размера видимой области и масштаба, то почему это нельзя сделать под капотом бекенда отрисовки? Опять же, я обойдусь без рисования в несколько потоков, но будет хорошо если оно будет выполняться в потоке, отдельном от остального гуя. И это мне тоже лень делать руками.

Axon ★★★★★
() автор топика
Ответ на: комментарий от d_a

Не знаю как там в Qt3, но в 4 и 5 такого никогда не было. Можно обновлять произвольный регион окна.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Landgraf

Спасибо, выглядит многообещающе. Буду пробовать.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Landgraf

На моих данных скорость отрисовки и отзывчивость pyqtgraph на порядок выше, чем у matplotlib. При этом, оно и в использовании по первым ощущениям куда приятнее. Прям годнота.

Axon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.