如何使matplotlib的显示每秒刷新一次?

时间:2019-04-11 07:41:42

标签: python matplotlib heatmap imshow redraw

有一个传感器,可以为我提供8x8的温度网格,可以在实时热图上显示。我已经做了一个8x8兰特来模拟该数据。该热图应该能够运行,直到我告诉它不再运行为止。我正在使用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()吗?我也没有弄清楚如何使他们的代码在我的机器上工作。

编辑:感谢第一位评论者的建议,我已经使其能够在树莓派上工作。但是现在我不禁要问...。我的Mac怎么了?

2 个答案:

答案 0 :(得分:1)

这是与this one类似的问题。 您可以尝试将代码修改为如下形式:

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)

今天过得愉快,休息一下:)。

答案 1 :(得分:0)

尝试这个:

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()

取消注释某些行以尝试某些变体...当然,其中一些将不起作用。