【问题标题】:Dynamically updating plot with watchdog使用看门狗动态更新绘图
【发布时间】:2016-10-04 02:49:23
【问题描述】:

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

问题是出现了一个白色的图形并且没有显示图。停止程序后,白色的身影消失,剧情出现。正确的图像已保存到文件中,但我希望实时显示图像。如果我注释掉 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'

【问题讨论】:

    标签: matplotlib watchdog


    【解决方案1】:

    以下应该做你想要的:

    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_created 函数并进入 While True - 循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多