Я хотел бы, чтобы мой сюжет обновлялся в прямом эфире. Он получает список из функции, в которую встроена функция, список постоянно увеличивается со временем. Таким образом, график должен остановиться в точке и не может быть бесконечным циклом. Кроме того, весь класс запускается в цикле.
Это код, который я придумал после нескольких дней исследований и программирования, но, к сожалению, я не могу заставить 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 и запускается каждый раз, когда получен твит.
Для matplotlib существует интерактивный режим, поэтому вы можете отделить процесс рисования от другого кода:
import matplotlib.pyplot as plt
plt.ion()
plt.plot([1,2,3]) # plots show here
# other stuff
Или звоните plt.show(block=False)
. Из документ:
In non-interactive mode, display all figures and block until the figures have been closed; in interactive mode it has no effect unless figures were created prior to a change from non-interactive to interactive mode (not recommended). In that case it displays the figures but does not block.
A single experimental keyword argument, block, may be set to True or False to override the blocking behavior described above.
В вашем случае вы можете изменить последнюю строку на show(block=False)
.
@ Фабиан Как ты это называешь? Можете ли вы опубликовать соответствующий код?
@Fabian хорошо, имо, лучше сохранить png в локальный каталог, потому что ваш рисунок, очевидно, будет довольно частым. А также вам нужно обрабатывать исключения/
@Fabian Потому что нет кода для закрытия всплывающих окон, поэтому вы наверняка закончите с кучей открывающихся окон. Сохранение их в каталоге и обработка определенных исключений более разумны.
Проблема здесь, с которой я столкнулся, заключается в том, что никто никогда не пытался напечатать что-то живое из того же кода, который генерирует данные для печати в цикле. есть ли возможное решение этого?
@Fabian Я не могу помочь без конкретной информации, но, возможно, поможет пост: stackoverflow.com/questions/458209/…
Спасибо за ваш быстрый ответ, к сожалению, весь код, упомянутый выше, выполняется в цикле в другой функции. plt.show(block=False) печатает 20 графиков, прежде чем выдает ошибку