Всякий раз, когда в каталог добавляется новый txt-файл, я хотел бы построить и показать данные из файла. Если появится другой файл, я хочу, чтобы график обновлял и показывал новые данные. Создание графика вне основных вызванных ошибок потока, поэтому я сделал (не очень хорошее) исправление с использованием глобальных переменных.Динамически обновляемый сюжет с watchdog
Проблема в том, что появляется белая фигура, и графики не отображаются. После остановки программы белая фигура исчезает и появляется сюжет. Правильное изображение сохраняется в файле, но я хотел бы, чтобы изображение отображалось в реальном времени. Если я прокомментирую plt.show(), никаких графиков не появится.
Я попробовал ответ «Динамически обновляемый сюжет в matplotlib» (Dynamically updating plot in matplotlib), но обнаружил, что, поскольку он никогда не вызывал show(), окна не появилось. Если я попытался вызвать show(), он заблокировал обновления.
Установка plt.pause() не работает (Real time matplotlib plot is not working while still in a loop)
Пример кода не работает (How to update a plot in matplotlib?)
Вот мой код:
import time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
import matplotlib.pyplot as plt
import numpy as np
import config
class MyHandler(PatternMatchingEventHandler):
patterns=["*.txt", "*.TXT"]
def on_created(self, event):
self.process(event)
def process(self, event):
filename = event.src_path
if '_AIt' in filename:
config.isnew=True
config.fname=filename
if __name__ == '__main__':
observer = Observer()
observer.schedule(MyHandler(), path='.', recursive=True)
observer.start()
dat=[0,1]
fig = plt.figure()
ax = fig.add_subplot(111)
Ln, = ax.plot(dat)
ax.set_xlim([0,10])
ax.set_ylim([-1,1])
plt.ion()
plt.show()
try:
while True:
time.sleep(1)
if config.isnew:
config.isnew=False
dataarray = np.array(np.transpose(np.loadtxt(config.fname)))
dat = dataarray[15] #AI0
Ln.set_ydata(dat)
Ln.set_xdata(range(len(dat)))
plt.savefig(config.fname[:-4] + '.png', bbox_inches='tight')
plt.draw()
except KeyboardInterrupt:
observer.stop()
observer.join()
config.py (создает значения по умолчанию для настройки конфигурации)
isnew=False
fname=""
Я смущен, так как следующий пример кода работает хорошо (от pylab.ion() in python 2, matplotlib 1.1.1 and updating of the plot while the program runs)
import pylab
import time
import matplotlib.pyplot as plt
import numpy as np
dat=[0,1]
fig = plt.figure()
ax = fig.add_subplot(111)
Ln, = ax.plot(dat)
ax.set_xlim([0,20])
ax.set_ylim([0,40])
plt.ion()
plt.show()
for i in range (18):
dat=np.array(range(20))+i
Ln.set_ydata(dat)
Ln.set_xdata(range(len(dat)))
plt.pause(1)
print 'done with loop'