GNUPlot如何在时间序列中绘制直方图

时间:2013-02-08 10:04:06

标签: gnuplot

我是gnuplot的新手,我很感激能帮助我了解如何绘制时间序列直方图

我的数据如下:

#Date    Time     WKB
20130206 11:45:57 4544
20130206 11:45:57 5113 
20130206 11:45:57 5117 
20130206 11:45:57 5123 
20130206 11:45:57 5129 
20130206 11:45:57 5151 
...................

我有大约2天的数据。

我需要绘制以下图表:

  1. 直方图中x minues(例如5分钟)的WKB平均值
  2. 直方图中x minues(例如5分钟)的WKB的累积和
  3. 这是我目前的剧本:

    set xdata time
    set xtics 36000
    set timefmt "%Y%m%d %H:%M:%S"
    set format x "%Y-%m-%dT%H:%M:%S"
    plot using 1:3 title smooth cumulative
    

    我确信我错过了很多东西。 :)

2 个答案:

答案 0 :(得分:1)

不幸的是,gnuplot不太适合处理这些数据处理任务。您可能可以提出一个解决方案,但它会非常混乱并且难以使用。幸运的是,gnuplot可以读取其他程序的管道 - 所以最简单的解决方案是编写一个简单的脚本来处理输入数据并将其写入标准输出。我选择python:

import time
from datetime import datetime
from collections import defaultdict
import sys

def datetime_2_epoch(dt):
    return int(time.mktime(dt.timetuple()))

def epoch_2_datetime(epoch):
    return datetime.fromtimestamp(epoch)

data = defaultdict(list)
with open(sys.argv[1]) as fin:
    for line in fin: #Parse file 1 line at a time
        timestr,datastr = line.rsplit(None,1)
        try:
            dt = datetime.strptime(timestr,"%Y%m%d %H:%M:%S")
            val = float(datastr)
        except ValueError: #couldn't read this line.  must be a comment or something.
            continue

        bin = datetime_2_epoch(dt)//300 #300 = 60*5 -- 5 minute bin size
        data[bin].append(val)

for bin,lst in sorted(data.items()):
    cum_sum = sum(lst)
    avg = cum_sum/len(lst)
    print epoch_2_datetime(bin*300),avg,cum_sum

这将格式化您的数据文件(在您的样本数据上运行):

2013-02-06 11:45:00 5029.5 30177.0
2013-02-06 11:55:00 5029.5 30177.0

可以用gnuplot中的方框绘制:

set xdata time
set timefmt '%Y-%m-%d %H:%M:%S'
set yrange [0:*]
plot '<python test.py test.dat' u 1:3 w boxes title "5 minute average"

plot '<python test.py test.dat' u 1:4 w boxes title "5 minute sum"

答案 1 :(得分:0)

即使使用 gnuplot 4.6.0(在 OP 提出问题时),也可以“轻松”使用 gnuplot 处理时间序列直方图。 检查以下示例。 它生成一个包含随机数据的文件(现在正态分布时间)并将其放入 5 分钟的 bin 中。 勾选 help smooth uniquehelp smooth frequency

代码:(使用 gnuplot 4.6.0 和 5.4.1 测试)

### time data histograms
reset

FILE = "myData.dat"

# create some random test data
set print FILE
    now = time(0)
    do for [i=1:1000] {
        print sprintf("%s %d", strftime("%Y%m%d %H:%M:%S",now+invnorm(rand(0))*3600), int(rand(0)*2000)+3000)
    }
set print

set xdata time
set timefmt "%Y%m%d %H:%M:%S"
set format x "%d.%m.\n%H:%M"

myBinWidth = 300   # 300 sec = 5 min
Bin(col) = floor(timecolumn(col)/myBinWidth)*myBinWidth

set boxwidth myBinWidth absolute
set xtics out
set style fill transparent solid 0.3

set multiplot layout 2,1
    set ytics 500
    plot FILE u (Bin(1)):3 smooth unique w boxes lc rgb "red" ti "Average in 5 min bins"

    set ytics 50000
    plot FILE u (Bin(1)):3 smooth freq w boxes lc rgb "blue" ti "Sum in 5 min bins"
unset multiplot
### end of code

结果:

enter image description here