gpt4 book ai didi

matplotlib - 使用看门狗动态更新绘图

转载 作者:行者123 更新时间:2023-12-04 17:59:09 25 4
gpt4 key购买 nike

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

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

最佳答案

下面应该做你想做的:

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 只是一个尝试。我真的不知道它在幕后是如何工作的,但这似乎有效。

关于matplotlib - 使用看门狗动态更新绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37624501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com