Как я могу заставить imshow matplotlib обновляться раз в секунду? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть датчик, который дает мне сетку времен 8x8, которую я должен отображать на активной тепловой карте.Я сделал рэнд 8х8 для имитации этих данных.Эта тепловая карта должна работать, пока я не скажу, чтобы она больше не запускалась.Я использую python3 и matplotlib, чтобы попробовать эту визуализацию.

Я пытался, как это сделать, включая очистку экрана, превращение plt в фигуру, указание show () не блокировать и т. Д. Многие из моих попыток можно увидеть в комментариях.Он либо отображается только один раз, либо никогда не отображается вообще (например, ion () и plt.show (block = False) никогда не отображают никаких данных).Я ударился головой о стену целых 2 рабочих дня, и я не могу понять, почему она не будет отображаться правильно.

import time
import socket
import matplotlib.pyplot as plt
import numpy as np 
import random

first = True
randArray = []

#plt.ion()
plt.show(block=False)
#fig = plt.figure()
#str1 = ''.join(str(e) for e in amg.pixels)
#print (type(str1))
while True:
    #create a bunch of random numbers
    randArray = np.random.randint(0,50, size=(8,8))
    #print the array, just so I know you're not broken
    for x in randArray:
        print(x)
    #This is my attempt to clear.   
    if (first == False):
        plt.clf()
    first = False
    #basical visualization
    plt.imshow(randArray, cmap='hot', interpolation='nearest')
    plt.draw()
    plt.show()
    #fig.canvas.draw()
    #plt.canvas.draw()
    #plt.display.update
    print("Pausing...")
    time.sleep(5)

Я ожидаю, что код будет генерировать новый набор чисел каждый5 секунд, а затем обновите экран цветами этих новых чисел.Это должно быть в состоянии работать в течение нескольких часов, если я не прерываю, но экран никогда не обновляется.

Подробнее: я перепробовал все, что перечислено в посте "Как обновить сюжет в matplotlib?"и все, что они делают, делает так, чтобы ни один граф не заполнялся.Средство запуска работает так, как будто оно собирается что-то сделать, показывая на панели задач, но затем ничего не делаетЯ пробовал это на Mac и Pi, оба имеют одинаковую проблему.Может быть, потому, что этому посту 8 лет, а это Python 3, а не Python 2?Может быть, это потому, что я использую imshow () вместо plot ()?Я так и не понял, как заставить их код работать на моей машине.

Редактировать: я получил его для работы на Raspberry Pi благодаря рекомендациям первых комментаторов.Но теперь мне остается задаться вопросом ... что не так с моим Mac ??

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Этот вопрос похож на этот .Вы можете попытаться изменить свой код так:

import time
import socket
import matplotlib.pyplot as plt
import numpy as np 
import random

first = True
randArray = []

#plt.ion()
plt.show(block=False)
#fig = plt.figure()
#str1 = ''.join(str(e) for e in amg.pixels)
#print (type(str1))
fig = plt.figure()
for i in range(0,5):
    #create a bunch of random numbers
    randArray = np.random.randint(0,50, size=(8,8))
    #print the array, just so I know you're not broken
    for x in randArray:
        print(x)
    #This is my attempt to clear.   
    if (first == False):
        plt.clf()
    first = False
    #basical visualization
    ax = fig.add_subplot(111)
    ax.imshow(randArray, cmap='hot', interpolation='nearest')
    fig.canvas.draw()
    fig.canvas.flush_events()
    #fig.canvas.draw()
    #plt.canvas.draw()
    #plt.display.update
    print("Pausing...")
    time.sleep(2)

Хорошего дня и немного отдохнуть :).

0 голосов
/ 12 апреля 2019

Попробуйте это:

import matplotlib.pyplot as plt
import numpy as np 

while True:
    #create a bunch of random numbers
    random_array = np.random.randint(0,50, size=(8,8))
    #print the array, just so I know you're not broken
    print(random_array)

    #clear the image because we didn't close it
    plt.clf()

    #show the image
#    plt.figure(figsize=(5, 5))
    plt.imshow(random_array, cmap='hot', interpolation='nearest')
    plt.colorbar()
    print("Pausing...")
    plt.pause(5)

   #uncomment this line and comment the line with plt.clf()
#    plt.close()

Магия со строкой plt.pause(5), она показывает изображение в течение пяти секунд.Вам решать, хотите ли вы закрыть его (plt.close()) или очистить (plt.clf()).Когда вы хотите постоянно обновлять свой сюжет, вы не используете plt.show() или plt.draw(), вы используете plt.pause().

Раскомментируйте некоторые строки, чтобы попробовать некоторые варианты ... конечно, некоторые из нихне сработает

...