运行matplotlib而不阻止控制台

时间:2020-06-18 19:18:47

标签: python multithreading matplotlib multiprocessing ipython

我尝试用类的方法绘制动态图。这大概是一种方法

def plot():
    axes = plt.gca(bock=False)
    ydata = []
    xdata = []

    axes.set_xlim(0, 200)
    axes.set_ylim(-1,1)
    line, = axes.plot(ydata, 'r-')

    i=0

    while True:

        xdata.append(i/10)
        ydata.append(np.sin(i/10))
        line.set_ydata(ydata)
        line.set_xdata(xdata)
        plt.draw()
        plt.pause(1e-17)
        i+=1
        plt.show()

问题在于,这是一个无限循环,在执行此循环功能期间,我无能为力。我不能使用我的Ipython控制台。我想在不阻止控制台的情况下运行此方法。我只是使用打印和线程来做类似的事情,但是matplotlib不支持线程。我尝试使用多处理程序,但仍会阻塞控制台。有什么选择吗?

1 个答案:

答案 0 :(得分:0)

所以这段代码有很多问题。 首先:您传递给bock的{​​{1}}自变量引发错误。 第二:plt.gca()停止执行,因此动画将不会开始。 要解决此问题,必须在调用plt.show()之后触发动画。 一种方法是利用事件。您可以在这里阅读有关它们的更多信息: https://matplotlib.org/3.2.1/users/event_handling.html 最后,您可以使用条件和plt.show()来确保循环不是无限的。 这是一个示例:

break

此外,如果您想更快地执行,请使用import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np def plot(lim=100): """ Parameters ---------- lim -> int: Iteration where you want to stop """ axes = plt.gca()#bock=False Was removed because it threw errors fig = plt.gcf() canvas = fig.canvas ydata = [] xdata = [] axes.set_xlim(0, 200) axes.set_ylim(-1,1) line, = axes.plot(xdata, ydata,'r-') #Now, we can't just start the loop because plt.show() will #Stop execcution. Instead we can make a trigger that starts #the loop. I will use a mouse event. def start_loop(): i=0 while True: xdata.append(i/10) ydata.append(np.sin(i/10)) line.set_ydata(ydata) line.set_xdata(xdata) canvas.draw() canvas.flush_events()#This makes the updating less laggy plt.pause(1e-17)#Removable i+=1 if i==lim: break canvas.mpl_connect("button_press_event", lambda click: start_loop()) #Click the plot to start the animation plt.show() plot() 或动画功能 来自matplotlib,例如blit

相关问题