繁体   English   中英

随着时间的推移使用Python和Matplotlib自更新图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM