如何使用Matplotlib更新实时绘图

时间:2019-05-21 09:48:06

标签: python matplotlib tkinter

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

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

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()

我希望在其他代码继续在后台运行的同时显示情节。

从获取鸣叫的循环中调用代码:

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都会触发该循环。

1 个答案:

答案 0 :(得分:0)

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

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

# other stuff

或者您可以致电plt.show(block=False)。来自doc

  

在非交互模式下,显示所有图形并阻止直到图形被关闭;在交互模式下,除非在非交互模式更改为交互模式之前创建图形(不推荐),否则它不会起作用。在这种情况下,它会显示数字,但不会阻塞。

     

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

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