我认为这是一个有趣的问题。我想从服务器读取数据,以便我可以使用matplotlib实时绘制数据。目前,我正在测试使用random
进行模拟所读取的值,并且我发现我收到了此错误:
File "/usr/lib/python2.7/dist-packages/matplotlib/lines.py", line 632, in recache
raise RuntimeError('xdata and ydata must be the same length')
RuntimeError: xdata and ydata must be the same length
我不明白,如果我使用互斥锁保护数据不被读取和更新,xdata
和ydata
的大小可能会不匹配。同时。您可以查看下面的严重简单代码:
import matplotlib.pyplot as plt
import time
from threading import Thread, Lock
import random
data = []
mutex = Lock()
# This just simulates reading from a socket.
def data_listener():
while True:
with mutex:
data.append(random.random())
if __name__ == '__main__':
t = Thread(target=data_listener)
t.daemon = True
t.start()
# initialize figure
plt.figure()
ln, = plt.plot([])
plt.ion()
plt.show()
plt.axis([0, 100, 0, 1])
while True:
plt.pause(0.1)
with mutex:
ln.set_xdata(range(len(data)))
ln.set_ydata(data)
plt.draw()
正如您所看到的,我确信在附加数据或添加数据以更新绘图时,您必须获取互斥锁,这意味着len(xdata)==len(ydata)
。我所做出的任何想法都会有所帮助。
您可以自己复制并运行代码。
答案 0 :(得分:1)
第一句话:如果您使用plt.draw()
,则不需要plt.pause()
,因为后者无论如何都会调用前者。
现在,如果我像下面这样修改脚本,“错误”永远不会被打印出来,所以它似乎运行良好。
import matplotlib.pyplot as plt
from threading import Thread, Lock
import random
data = []
mutex = Lock()
# This just simulates reading from a socket.
def data_listener():
while True:
with mutex:
data.append(random.random())
if __name__ == '__main__':
t = Thread(target=data_listener)
t.daemon = True
t.start()
# initialize figure
plt.figure()
ln, = plt.plot([])
plt.ion()
plt.show()
plt.axis([0, 100, 0, 1])
while True:
with mutex:
try:
ln.set_xdata(range(len(data)))
ln.set_ydata(data)
plt.gca().set_xlim(len(data)-60,len(data) )
plt.pause(0.1)
except:
print ("error")