【问题标题】:Run matplotlib without blocking the console在不阻塞控制台的情况下运行 matplotlib
【发布时间】:2020-06-18 19:18:47
【问题描述】:

我尝试在类的方法中制作动态图。这里或多或少是方法

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 不支持线程。我尝试使用多处理,但仍然阻塞控制台。有什么选择吗?

【问题讨论】:

    标签: python multithreading matplotlib multiprocessing ipython


    【解决方案1】:

    所以这段代码有很多问题。 首先:您传递给plt.gca()bock 参数引发了错误。 第二:plt.show() 停止执行,因此动画不会开始。 要解决这个问题,您必须在调用 plt.show() 后触发动画。 一种方法是利用事件。你可以在这里阅读更多关于它们的信息: https://matplotlib.org/3.2.1/users/event_handling.html 最后,您可以使用条件和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()
    
    

    此外,如果您想更快地执行,请使用blit 或动画功能 来自 matplotlib,例如 FuncAnimation

    【讨论】:

    • 我尝试做的是在不干扰控制台的情况下执行它。当您运行代码时,您无法在控制台中编写任何内容,直到您的代码完成运行。我想要做的是启动这个功能,但不会像这样阻塞控制台,代码可以做动态绘图,同时我可以在控制台中编写和执行一些东西。
    • 然后你只需从终端使用 python 或空闲。然后在制作情节之前,使用plt.ion()。这将使图形在您编写代码时实时变化。
    • 但这仍然会阻止控制台。在情节期间,我无法在控制台中写入任何内容。
    • 根据stackoverflow.com/questions/33696861/… 使用FuncAnimation 是适合您的解决方案。
    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2023-03-28
    • 2023-03-24
    • 2021-09-05
    相关资源
    最近更新 更多