Python 如何使用Matplotlib更新实时绘图

Python 如何使用Matplotlib更新实时绘图,python,matplotlib,tkinter,Python,Matplotlib,Tkinter,我希望我的情节能够实时更新。它从一个函数中获取一个列表,函数嵌入其中,随着时间的推移,列表不断变长。因此,绘图必须在某一点停止,并且不能在有限循环中绘制。此外,整个类在循环中运行 这是我经过几天的研究和编程后得出的代码,但不幸的是,我无法让plpot显示出来 class LiveGraph(): def __init__(self): fig = plt.figure() self.ax1 = fig.add_subplot(1,1,1)

我希望我的情节能够实时更新。它从一个函数中获取一个列表,函数嵌入其中,随着时间的推移,列表不断变长。因此,绘图必须在某一点停止,并且不能在有限循环中绘制。此外,整个类在循环中运行

这是我经过几天的研究和编程后得出的代码,但不幸的是,我无法让plpot显示出来

class LiveGraph():

    def __init__(self):

        fig = plt.figure()
        self.ax1 = fig.add_subplot(1,1,1)
        self.xar=[]
        self.yar=[]
        self.h1=self.ax1.plot(self.xar, self.yar)[0]

    def update_plot(self):
        graph_data=open("twitter-out.txt", "r")
        graph_data=list(graph_data)
        graph_data=graph_data[0].split(",")

        x=0
        y=0

        for l in graph_data:
            x+=1
            try:
                y=float(l)
            except BaseException as e:
                pass
            self.xar.append(x)
            self.yar.append(y)

        self.h1.set_xdata(self.xar)
        self.h1.set_ydata(self.yar)
        plt.draw()
我想有情节显示自己,而其余的代码继续在背景中

该代码是从获取tweet的循环中调用的:

class StdOutListener(StreamListener):  
    def on_data(self,data):
        try:
            all_data = json.loads(data)
            text=all_data["text"]

            temp_text=TextBlob(text)
            analysis=temp_text.sentiment.polarity

            output = open("twitter-out.txt","a")
            output.write(str(analysis))
            output.write(",")
            output.close()

            print("sucsess")

            live_graph=LiveGraph()
            live_graph.update_plot()

            return True

        except BaseException as e:
            print('Failed: ', str(e))
此循环是tweepy库的一部分,每次收到tweet时都会触发。

有一个for matplotlib,因此您可以将绘图过程与其他代码分离:

import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3]) # plots show here

# other stuff
或者您可以调用
plt.show(block=False)
。发件人:

在非交互模式下,显示所有图形和块,直到图形关闭;在交互模式下,除非图形是在从非交互模式更改为交互模式(不推荐)之前创建的,否则它无效。在这种情况下,它会显示图形,但不会阻塞

单个实验关键字参数block可以设置为True或False,以覆盖上述阻塞行为


在您的情况下,您可以将最后一行更改为
show(block=False)

谢谢您的快速回复,不幸的是,上面提到的整个代码在另一个函数的循环中运行。plt.show(block=False)在抛出error@Fabian你怎么称呼它?你能发布相关代码吗?@Fabian嗯,依我看,最好将PNG保存到本地目录,因为你的绘图显然会非常频繁。此外,您还需要处理异常/@Fabian,因为没有代码来关闭弹出窗口,因此最终肯定会打开大量窗口。将它们保存到一个目录并处理特定的异常更为合理。这里我面临的问题是,从来没有人试图从生成要在循环中打印的数据的同一代码中打印某些内容。有什么可能的解决办法吗?