Python - 实时更新图;在x轴上绘制时间

时间:2015-11-01 10:42:44

标签: python matplotlib graph

我有一个python脚本,以

的形式从服务器收集数据
<hh-mm-ss>,<ddd>

这里,第一个字段是Date,第二个字段是整数。这些数据正被写入文件中。

我正在运行另一个线程,它正在绘制我在上一段中提到的文件中的实时图表。

所以这个文件有像

这样的数据
<hh-mm-ss>,<ddd>
<hh-mm-ss>,<ddd>
<hh-mm-ss>,<ddd>
<hh-mm-ss>,<ddd>

现在我想用上面显示的数据绘制时间序列Matplotlib图。 但是当我尝试时,它会抛出一个错误说,

ValueError: invalid literal for int() with base 10: '15:53:09'

当我有如下所示的正常数据时,事情很好

<ddd>,<ddd>
<ddd>,<ddd>
<ddd>,<ddd>
<ddd>,<ddd>

更新 我从上面描述的文件生成图形的代码如下所示,

def animate(i):

    pullData = open("sampleText.txt","r").read()
    dataArray = pullData.split('\n')
    xar = []
    yar = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            xar.append(int(x))
            yar.append(int(y))
    ax1.clear()
    ax1.plot(xar,yar)

更新代码

def animate(i):
    print("inside animate")
    pullData = open("sampleText.txt","r").read()
    dataArray = pullData.split('\n')
    xar = []
    yar = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            timeX=datetime.strptime(x, "%H:%M:%S")
            xar.append(timeX.strftime("%H:%M:%S"))
            yar.append(float(y))
    ax1.clear()
    ax1.plot(xar,yar)

现在我收到此行的错误(ax1.plot(xar,yar)) 我将如何克服这个?

2 个答案:

答案 0 :(得分:0)

您正在尝试从表示时间戳的字符串中解析整数。当然它失败了。

为了能够在绘图中使用时间戳,您需要将它们解析为正确的类型,例如datetime.timedatetime.datetime。您可以使用datetime.datetime.strptime()dateutil.parser.parse()time.strptime()进行此操作。

绘制数据是直截了当的。看一下交互式绘图模式:matplotlib.pyplot.ion()

供参考/进一步阅读:

根据您的代码,我创建了一个示例。我已经概述了为什么我认为这样做更好。

# use with-statement to make sure the file is eventually closed
with open("sampleText.txt") as f:
    data = []
    # iterate the file using the file object's iterator interface
    for line in f:
        try:
            t, f = line.split(",")
            # parse timestamp and number and append it to data list
            data.append((datetime.strptime(t, "%H:%M:%S"), float(f)))
        except ValueError:
            # something went wrong: inspect later and continue for now
            print "failed to parse line:", line
# split columns to separate variables
x,y = zip(*data)
# plot
plt.plot(x,y)
plt.show()
plt.close()

进一步阅读:

答案 1 :(得分:-1)

错误告诉您问题的原因:您正在尝试将字符串(例如'15:53:09')转换为整数。此字符串不是有效数字。

相反,您应该考虑使用datetime模块中的datetime对象来处理日期/时间事务,或者至少使用{{1}将字符串split转换为字段分隔符和分别使用每个字段。

考虑这个简短的演示:

':'