2016-06-03 7 views
2

Всякий раз, когда в каталог добавляется новый 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' 

ответ

0

Ниже следует делать то, что вы хотите:

import time 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 
import matplotlib.pyplot as plt 

plt.ion() # enter interactive mode 
ax = fig.add_subplot(111) 
Ln, = ax.plot(dat) 
ax.set_xlim([0,10]) 
ax.set_ylim([-1,1]) 
plt.draw() # non-blocking drawing 
plt.pause(.001) # This line is essential, without it the plot won't be shown 

try: 
    while True: 
     time.sleep(1) 
     if config.isnew: 
      ... 
      plt.draw() 
      plt.pause(.001) 

except KeyboardInterrupt: 
    observer.stop() 
observer.join() 

Эфирное тонкий позвонить plt.pause после plt.draw вызова, иначе он не будет нарисован, как другой код кода python matplotlib. Значение .001 - это просто попытка. Я действительно не знаю, как это работает под капотом, но это, похоже, работает.