0

我是 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 分钟(例如 5 分钟)的 WKB 平均值
  2. 直方图中 x 分钟(例如 5 分钟)的 WKB 累积总和

这是我当前的脚本:

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

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

4

2 回答 2

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"
于 2013-02-09T21:06:26.263 回答
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

结果:

在此处输入图像描述

于 2021-05-12T11:42:18.077 回答