Как обновить живые сюжеты с Matplotlib - PullRequest
0 голосов
/ 21 мая 2019

Я бы хотел, чтобы мой сюжет обновлялся вживую. Он получает список из функции, в которую встроена функция, список постоянно увеличивается с течением времени. Таким образом, построение графика должно быть остановлено в точке и не может быть бесконечным. Более того, весь класс запускается в цикле.

Это код, который я придумал после нескольких дней исследований и программирования, но, к сожалению, я не могу заставить 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()

Мне бы хотелось, чтобы график отображался сам, пока остальная часть кода остается в фоновом режиме.

Код вызывается из цикла, получая твиты:

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 и запускается при каждом получении твита.

1 Ответ

0 голосов
/ 21 мая 2019

Существует интерактивный режим для matplotlib, так что вы можете отсоединить процесс рисования от другого кода:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...