在不阻塞控制台的情况下运行matplotlib

2024-09-26 18:07:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个类的方法中绘制一个动态图。这里或多或少有一个方法

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


Tags: 方法plotdefline绘制plt线程set
1条回答
网友
1楼 · 发布于 2024-09-26 18:07:15

所以这个代码有很多问题。 第一:传递给plt.gca()bock参数引发了错误。 第二:plt.show()停止执行,因此动画不会启动。 要解决此问题,必须在调用plt.show()后触发动画。 一种方法是利用事件。您可以在此处阅读更多关于它们的信息: https://matplotlib.org/3.2.1/users/event_handling.html 最后,您可以使用条件andbreak来确保循环不是无限的。 以下是一个例子:

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

相关问题 更多 >

    热门问题