我是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天的数据。
我需要绘制以下图表:
这是我目前的剧本:
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
我确信我错过了很多东西。 :)
答案 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 unique
和 help 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
结果: