LINUX.ORG.RU

matplotlib: визуализировать данные по мере расчёта

 ,


0

2

subj. Идёт расчёт, хочется визуализировать 2d-массив по мере эволюции системы. Рисую через imshow. Нашёл такое решение https://stackoverflow.com/questions/17835302/how-to-update-matplotlibs-imshow..., но если в явном виде задавать фигуры и оси (fig,ax=plt.subplots()), то оно вместо апдейта окна спавнит множество окон. Может кто ни будь поделиться минимальным рабочим примером?

★★★★★

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
 
plt.style.use('dark_background') # theme plot
 
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1)
 
 
def animate(i):

    # set data there
    xs = [x * 0.1 for x in range(10)]                      # data x
    ys = [random.randint(0,100) * 0.01 for x in range(10)] # data y
 
    print(xs)
    print(ys)

    ax1.clear()
    ax1.plot(xs, ys)
 
    plt.xlabel('X axis')
    plt.ylabel('Y axis')
 
 
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()

это оно или не ?

nionio35
()

Немножечко не юниксвейный подход.

У нас есть самописный гпушный вьювер, который юзали таким вот образом (смотрели в рантайме че там и как считается). Каждое прикручивание его к новому приложению превращалось в квест.

Новая версия вьювера работает отдельно и просто смотрит за файлом - файл обновился - картинка автоматом перестроилась. Файл дампится на tmpfs, все совершенно тривиально.

AntonI ★★★★
()

Если точек не очень много, а время много, то можно сделать что-то вроде:


def im_update(val):
    #перерисуем масштабную линейку

    Plot.norm.vmin=val[0]
    Plot.norm.vmax=val[1]
    cbar_ticks = np.linspace(val[0], val[1], num=11, ndpoint=True)
    cbar.set_ticks(cbar_ticks) 
    cbar.draw_all() 

    #обновим картинку
    fig.canvas.draw()
    fig.canvas.flush_events()

....

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.15)
Plot=ax.imshow(img, extent=[x_min,x_max,y_min,y_max])
cbar=plt.colorbar(Plot)
cont_ax = plt.axes([0.1, 0.05, 0.65, 0.02])
s_cont = RangeSlider(
    cont_ax, "Max", 1, 100,
    valinit=(10,50), valstep=5,
    color="green")
    
s_cont.on_changed(im_update)

.....
while ...
   img = #новые данные
   Plot.set_data(img)
   Plot.norm.vmax=np.amax(img)
   Plot.norm.vmin=np.amin(img)
   s_cont.set_max(np.amax(img))
   s_cont.set_min(np.amin(img))
   cbar_ticks = np.linspace(np.amin(img), np.amax(img), num=11, endpoint=True)
   cbar.set_ticks(cbar_ticks) 
   cbar.draw_all() 
   fig.canvas.draw()
   fig.canvas.flush_events()
   
   if ...:
       break
....

Когда данные получены, можно спокойно в окошке искать особенности с помощью ползунка.

ArtSh ★★★
()

Там в каментах к вопросу есть ссылка на другой вопрос. Пробовали такое решение оттуда?

import matplotlib.pyplot as plt
import numpy

fig,ax = plt.subplots(1,1)
image = numpy.array([[1,1,1], [2,2,2], [3,3,3]])
im = ax.imshow(image)

while True:       
    image = numpy.multiply(1.1, image)
    im.set_data(image)
    fig.canvas.draw_idle()
    plt.pause(1)
mydibyje ★★★
()