Я сделал что-то подобное в проекте, над которым работаю, под названием runviewer. Общая идея заключается в повторной выборке данных всякий раз, когда изменяется x-диапазон графика. Приблизительный метод, который мы используем:
Подключите метод к сигналу sigXRangeChanged
сигнала PlotWidget
, который устанавливает логический флаг, указывающий, что данные должны быть передискретизированы.
Запустите поток, который опрашивает логический флаг каждые x секунд (мы выбрали 0,5 секунды), чтобы увидеть, нужно ли выполнять повторную выборку данных. Если да, данные передискретизируются с использованием алгоритма по вашему выбору (мы написали свой собственный на C). Затем эти данные отправляются обратно в основной поток (например, используйте QThread
и отправляйте сигнал обратно в основной поток), где выполняется вызов pyqtgraph для обновления данных на графике (обратите внимание, вы можете вызывать методы pyqtgraph только из основная тема!)
Мы используем логический флаг, чтобы отделить события изменения x-диапазона от повторной выборки. Вы не хотите передискретизировать каждый раз, когда изменяется x-диапазон, так как сигнал запускается много раз, когда вы увеличиваете масштаб с помощью мыши, и вы не хотите генерировать очередь вызовов передискретизации, поскольку передискретизация выполняется медленно, даже с C !
Вы также должны убедиться, что ваш поток передискретизации немедленно устанавливает логический флаг в False, если он обнаруживает, что он имеет значение True, а затем запускает алгоритм передискретизации. Это делается для того, чтобы последующие события изменения x-диапазона во время текущей передискретизации приводили к последующей передискретизации.
Вы также, вероятно, могли бы улучшить это, не опрашивая флаг, а используя какое-то потоковое событие/условие.
Обратите внимание, что повторная выборка с помощью Python очень, очень медленная, поэтому мы решили написать алгоритм повторной выборки C и вызывать его из Python. numpy в основном на C, так что будет быстро. Однако я не думаю, что у них была функция, сохраняющая алгоритм передискретизации. Большинство людей, выполняющих повторную выборку, — это просто стандартная понижающая выборка, при которой вы берете каждую N-ю точку, но мы хотели по-прежнему иметь возможность видеть наличие функций, меньших размера выборки при уменьшении масштаба.
Дополнительные комментарии по производительности
Я подозреваю, что часть проблемы производительности со встроенным методом pyqtgraph заключается в том, что понижение частоты дискретизации выполняется в основном потоке. Таким образом, понижающая дискретизация должна быть завершена до того, как график снова станет реагировать на пользовательский ввод. Наш метод позволяет этого избежать. Наш подход также ограничивает количество раз, когда происходит понижение частоты дискретизации, максимум раз в the length of time it takes to down-sample + the poll delay
секунды. Таким образом, с задержкой, которую мы используем, мы снижаем частоту дискретизации только каждые 0,5-1 секунду, сохраняя при этом отзывчивость основного потока (и, следовательно, пользовательского интерфейса). Это означает, что пользователь может увидеть данные с грубой выборкой, если быстро увеличить масштаб, но это исправляется не более чем за 2 итерации повторной выборки (то есть задержка не более 1-2 секунд). Кроме того, поскольку на исправление требуется короткое время, обновление/перерисовка с использованием новых выборочных данных часто выполняется после того, как пользователь закончил взаимодействие с пользовательским интерфейсом, поэтому он не замечает зависаний во время перерисовки.
Очевидно, что время, которое я цитирую, полностью зависит от скорости передискретизации и задержки опроса!
person
three_pineapples
schedule
28.05.2015