python xdata和ydata的长度必须相同

时间:2017-10-16 20:37:49

标签: python multithreading matplotlib mutex

我认为这是一个有趣的问题。我想从服务器读取数据,以便我可以使用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 

我不明白,如果我使用互斥锁保护数据不被读取和更新,xdataydata的大小可能会不匹配。同时。您可以查看下面的严重简单代码:

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)。我所做出的任何想法都会有所帮助。

您可以自己复制并运行代码。

1 个答案:

答案 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")