matplotlib.animation 无法使用来自线程的数据进行更新

matplotlib.animation cannot update using data from threading

我正在尝试在 Matplotlib 实时图表上显示来自传感器的数据。

我想创建一个连续读取传感器的线程。然后,我使用 matplotlib.animation 使用当时传感器读数列表中的任何数据更新图表。

问题是 matplotlib.animation 似乎只从传感器读取数据一次,然后就死机了。知道如何解决这个问题吗?

import random
import threading
import matplotlib.animation as animation
import matplotlib.pyplot as plt

def ReadSensors():  
    global listXData
    global listTemp
    # Should be sensor data. Using dummy random data for now...
    listTemp = [ random.randint(0,5) for x in listXData ] 


def UpdateFigure(oFrame):
    global listXData
    oCurve_Temp.set_data(listXData, listTemp)
    return oCurve_Temp, 

# Initialize data lists
listXData = range(0,100)
listTemp = [0 for x in listXData]

# Initialize graph
fig, ax = plt.subplots()
ax.set_title('Temperature')
ax.set_xlabel('Data Point')
ax.set_ylabel('[oC]')
ax.set_xlim( 0, 100)
ax.set_ylim( 0, 5)
oCurve_Temp, = ax.plot([],[])

# Starts reading sensor
oThread_ReadSensors = threading.Thread(target = ReadSensors)
oThread_ReadSensors.daemon = True
oThread_ReadSensors.start()

# Update graph
ani = animation.FuncAnimation(fig, UpdateFigure, interval=500)

plt.show()

您看不到任何动画,因为数据实际上并没有改变。所以动画再次显示所有相同的数据。 实际更改数据是有意义的。 下面的数据每 600 毫秒更改一次,动画每 400 毫秒显示一个新帧,因此有些帧显示与前一帧相同的数据。

import time
import random
import threading
import matplotlib.animation as animation
import matplotlib.pyplot as plt

def ReadSensors():  
    global listXData
    global listTemp
    # Should be sensor data. Using dummy random data for now...
    while True: 
        listTemp = [ random.randint(0,5) for x in listXData ]
        time.sleep(0.6)

def UpdateFigure(oFrame):
    print "update"
    global listXData
    oCurve_Temp.set_data(listXData, listTemp)
    return oCurve_Temp, 

# Initialize data lists
listXData = range(0,100)
listTemp = [0 for x in listXData]

# Initialize graph
fig, ax = plt.subplots()
ax.set_title('Temperature')
ax.set_xlabel('Data Point')
ax.set_ylabel('[oC]')
ax.set_xlim( 0, 100)
ax.set_ylim( 0, 5)
oCurve_Temp, = ax.plot([],[])

# Starts reading sensor
oThread_ReadSensors = threading.Thread(target = ReadSensors)
oThread_ReadSensors.daemon = True
oThread_ReadSensors.start()

# Update graph
ani = animation.FuncAnimation(fig, UpdateFigure, interval=400)

plt.show()
# Join the thread not to run into 
# an unterminated threat when closing the figure
oThread_ReadSensors.join()