[英]Self-updating graphs over time with Python and matplotlib
我不熟悉Python中的matplotlib。 我要实现的是使用一个文本文件随着时间的推移绘制数据,该文件每隔一段时间接收一次新数据。
文本文件格式如下:
数据,时间
1,2015-07-05 11:20:00
到目前为止,我有:
import matplotlib.pyplot as plt
import matplotlib.dates as md
import dateutil
pullData = open('sampleText.txt', 'r').read()
dataArray = pullData.split('\n')
datestrings = []
plt_data = []
for eachLine in dataArray:
if len(eachLine)>1:
y,x = eachLine.split(',')
plt_data.append(int(y))
datestrings.append(x)
dates = [dateutil.parser.parse(s) for s in datestrings]
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
ax.set_xticks(dates)
xfmt = md.DateFormatter('%m-%d %H:%M')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,plt_data, "o-")
plt.show()
通过不同的教程/先前的问题,这几乎可以解决我的问题。
如您所见,此代码可用于随时间推移绘制数据,但是我不明白如何以图形将自身更新为新数据的方式来适应它。
假设您的文本文件正在写入中,并附加有新数据。
然后,当文件被修改时,您可以使用inotify来获取警报,并将该函数“挂起”到该事件以更新图形。
看一下此页面 ,其中有几个示例说明如何使用pyinotify捕获事件。 还提供了一个minimal example
,它显示了程序的“结构”:
import pyinotify
# Instantiate a new WatchManager (will be used to store watches).
wm = pyinotify.WatchManager()
# Associate this WatchManager with a Notifier (will be used to report and
# process events).
notifier = pyinotify.Notifier(wm)
# Add a new watch on /tmp for ALL_EVENTS.
wm.add_watch('/tmp', pyinotify.ALL_EVENTS)
# Loop forever and handle events.
notifier.loop()
最重要的是,可以将pyinotify.ALL_EVENTS更改为仅侦听您感兴趣的事件(例如文件修改或在文件尚不存在时创建)
您可以使用功能动画来做到这一点,也可以使用以下代码:
line, = ax.plot(dates,plt_data, "o-")
plt.show(block=False)
while True:
# use some method as the one proposed by jcoppens to read your new data
line.set_data(new_dates, new_data)
# timeout/sleep until new data arrives
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.