Matplotlib 用看门狗动态更新绘图

Matplotlib 用看门狗动态更新绘图,matplotlib,watchdog,Matplotlib,Watchdog,每当一个新的txt文件被添加到一个目录中,我都想打印并显示文件中的数据。如果出现另一个文件,我希望绘图更新并显示新数据。在主线程之外创建绘图会导致错误,因此我使用全局变量进行了(不是很好)修复 问题是会出现一个白色的数字,而曲线图不会显示。停止程序后,白色图形消失,并显示绘图。正确的图像保存到文件中,但我希望图像能够实时显示。如果注释掉plt.show(),则不会显示任何绘图 我尝试了“在matplotlib中动态更新绘图”答案(),但发现因为它从未调用show(),所以没有出现窗口。如果我尝试

每当一个新的txt文件被添加到一个目录中,我都想打印并显示文件中的数据。如果出现另一个文件,我希望绘图更新并显示新数据。在主线程之外创建绘图会导致错误,因此我使用全局变量进行了(不是很好)修复

问题是会出现一个白色的数字,而曲线图不会显示。停止程序后,白色图形消失,并显示绘图。正确的图像保存到文件中,但我希望图像能够实时显示。如果注释掉plt.show(),则不会显示任何绘图

我尝试了“在matplotlib中动态更新绘图”答案(),但发现因为它从未调用show(),所以没有出现窗口。如果我尝试调用show(),它会阻止更新

插入plt.pause()无效()

示例代码不起作用()

这是我的密码:

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(创建配置设置的默认值)

我很困惑,因为下面的示例代码工作得很好(来自)


以下操作应满足您的要求:

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.draw
调用之后调用
plt.pause
,否则它将不会被绘制,就像另一个python代码块
matplotlib
一样。值
.001
只是一次尝试。我真的不知道它在引擎盖下是如何工作的,但这似乎是可行的。

如果其他人对此有困难:必须将绘图从on_创建的函数中移出,进入While True-循环
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'
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()