在python中通过多线程绘制多个实时图

时间:2021-05-22 12:41:16

标签: python multithreading matplotlib

我使用线程库使用 matplotlib 绘制了 2 个实时图表。

from fbm import MBM
import matplotlib.pyplot as plt
import threading

plt.style.use('ggplot')
fig, ax = plt.subplots(nrows=2, ncols=1)


def h_90(t):
    return 0.9


def h_75(t):
    return 0.75


def thread_fgn_9():
    x_vec = []
    y_vec = []
    i = 1
    while True:
        f = MBM(n=1, hurst=h_90, length=1, method='riemannliouville')
        fgn_sample = f.mgn()
        x_vec.append(i)
        y_vec.append(fgn_sample[0])
        i += 1
        ax[0].plot(x_vec, y_vec, "g-o")
        plt.pause(0.1)
    plt.show()


def thread_fgn_75():
    x_vec_ = []
    y_vec_ = []
    i = 1
    while True:
        f = MBM(n=1, hurst=h_75, length=1, method='riemannliouville')
        fgn_sample = f.mgn()
        x_vec_.append(i)
        y_vec_.append(fgn_sample[0])
        i += 1
        ax[1].plot(x_vec_, y_vec_, "r-o")
        plt.pause(0.2)
    plt.show()


if __name__ == "__main__":

    plt.ion()
    x2 = threading.Thread(target=thread_fgn_75(), name="H_75")
    x2.daemon = True
    x2.start()
    x1 = threading.Thread(target=thread_fgn_9(), name="H_90")
    x1.daemon = True
    x1.start()

我希望看到实时绘制的图,但我看到如下内容: enter image description here

有人能理解我的代码有什么问题吗??代码已完成,您只需在 IDE 中复制/粘贴即可运行它。

谢谢

================== 新变化 ================ 我刚刚更改了主要部分,如下所示:

if __name__ == "__main__":

    x1 = threading.Thread(target=thread_fgn_9(), name="H_90").start()
    x2 = threading.Thread(target=thread_fgn_75(), name="H_75").start()
    plt.show()

但结果还是和之前一样。

======新的新变化 ================

if __name__ == "__main__":
    x1 = threading.Thread(target=thread_fgn_9, name="H_90").start()
    x2 = threading.Thread(target=thread_fgn_75, name="H_75").start()
    #plt.pause(0.2)
    plt.show()

我刚刚删除了 target=function_name 中的括号 似乎是正确的,但情节显示不顺利。我也在控制台中看到这样的错误:

  File "/usr/local/lib/python3.9/site-packages/matplotlib/transforms.py", line 312, in xmin
    return np.min(self.get_points()[:, 0])
  File "<__array_function__ internals>", line 5, in amin
RecursionError: maximum recursion depth exceeded

-------最终改动----------------------

在 matplotlib 中执行此操作的最佳方法是以下代码:

plt.style.use('ggplot')
fig, ax = plt.subplots(nrows=2, ncols=1)
mutex = Lock()

def thread_fgn_9():
    print(threading.current_thread().getName())
    x_vec = []
    y_vec = []
    i = 1
    while True:
        #mutex.acquire()
        f = MBM(n=1, hurst=h_90, length=1, method='riemannliouville')
        fgn_sample = f.mgn()
        x_vec.append(i)
        y_vec.append(fgn_sample[0])
        i += 1
        ax[0].plot(x_vec, y_vec, "g-o")
        plt.pause(0.01)
        #mutex.release()


def thread_fgn_75():
    print(threading.current_thread().getName())
    x_vec_ = []
    y_vec_ = []
    i = 1
    while True:
        #mutex.acquire()
        f = MBM(n=1, hurst=h_75, length=1, method='riemannliouville')
        fgn_sample = f.mgn()
        x_vec_.append(i)
        y_vec_.append(fgn_sample[0])
        i += 1
        ax[1].plot(x_vec_, y_vec_, "r-o")
        plt.pause(0.01)
        #mutex.release()


if __name__ == "__main__":
    x1 = multiprocessing.Process(target=thread_fgn_9, name="H_90").start()
    x2 = multiprocessing.Process(target=thread_fgn_75, name="H_75").start()
    plt.show()

我相信原因是因为两个进程都试图写在一个主情节中。为了让多个平滑图随时间变化,我们需要采用另一种技术。

1 个答案:

答案 0 :(得分:1)

thread_fgn_9 被调用并阻塞,甚至在它被发送到线程之前。一定要发送函数本身。

plt.pauseplt.show 需要从主线程调用。此外,Matplotlib 通常不提供线程安全保证,因此除非您确切地知道自己在做什么,否则您应该完全避免这个概念。请考虑此问题中的技巧:Fast Live Plotting in Matplotlib / PyPlot

相关问题