• XSS.stack #1 – первый литературный журнал от юзеров форума

matplotlib тормозит

gliderexpert

CPU register
Забанен
Регистрация
17.02.2021
Сообщения
1 440
Решения
1
Реакции
2 336
Пожалуйста, обратите внимание, что пользователь заблокирован
Возникла задача рисовать вот такие картинки (в реальном времени, по мере поступления информации с системы сбора данных). Так называемый график-"водопад".
FFT_Waterfall_example_ATIS.gif


С гуями/интерфейсами - опыта работы нет. Поиск в гугле обнаружил библиотеку matplotlib для питона, при помощи которой такие штуки вроде как делаются.

Накодил тест
Python:
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import numpy as np
import random

max_arr = 30
vect = np.zeros(max_arr)
vect[5]=3

for i in range(max_arr):
        vect[i]=random.randint(1,10)

X = np.zeros((max_arr,max_arr))
for i in range(max_arr):
        for n in range(max_arr):
                X[i,n]=n

Y = np.zeros((max_arr,max_arr))
for i in range(max_arr):
        for n in range(max_arr):
                Y[i,n]=i

Z = np.zeros((max_arr,max_arr))
Z[:,max_arr-1]=vect
fig,ax=plt.subplots()

for c in range(100):
        for i in range(max_arr-1):
                Z[:,i]=Z[:,i+1]
                ax.pcolormesh(X,Y,Z)
        for n in range(max_arr):
                vect[n]=random.randint(1,10)
        Z[:,max_arr-1]=vect
        ax.pcolormesh(X,Y,Z)
        plt.pause(0.5)
plt.show()

Фактически все просто - создаем массив размером max_arr х max_arr (в примере 30х30 точек), потом в цикле
- сдвигаем все столбцы влево на 1 столбец
- в правый столбец кладем рандомные числа (имитация реальных данных)
- отрисовываем в pcolormesh

И оно даже работает.
gui.png

Только вот проблема в том, что при увеличении размерности массивов a.k.a. разрешения картинки - все начинает дико тормозить при перерисовке/обновлении.
Если задать max_arr = 300 то прога вообще не стартует, виснет на белом экране. А мне нужно отображать массив 3000х3000 с частотой обновления хотя бы пару Герц.

Куда пнуть питона чтобы оно заработало с нормальной скоростью?
 
Проблема в том, что ты каждый раз полностью перерисовываешь график, а нам нужно просто обновлять данные. Используй метод set_array() для этого
 
При итерации в приделах больших диапазонов намного выгодней использовать np.arange() вместо range(), особенно где нужно работать с плавающей запятой. Хотя я думаю проблема действительно в постоянной прорисовке.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх