gnuplot覆盖同一时间不同的日子情节?

时间:2018-05-16 18:58:43

标签: date time gnuplot overlay

我有两个同时的两个数据文件

date1data.csv

2018.02.03.18:23,4
2018.02.03.19:23,22
2018.02.03.20:23,12
2018.02.03.21:23,3
2018.02.03.22:23,16

date2data.csv

2018.02.04.18:23,1
2018.02.04.19:23,5
2018.02.04.20:23,22
2018.02.04.21:23,5
2018.02.04.22:23,14

如果我绘制它们,我会得到这个图,其中数据是在一天之后绘制的。 image
我如何仅根据时间而不是日期绘制它们以便它们同时叠加?这可能吗?我不想在多个窗口中绘制它们。

这就是我用于绘图的代码:

set datafile separator ","
set terminal pngcairo size 500,200 enhanced font 'Verdana,10' linewidth 1
set output 'test.png'
set xdata time
set timefmt "%Y.%m.%d.%H:%M"
set format x "%H:%M"
plot 'date1data.csv' using 1:2 w lines lw 2 t "day1", 'date2data.csv' using 1:2 w lines lw 2 t "day2"

3 个答案:

答案 0 :(得分:2)

您可以使用删除第1列时间字符串的日期部分的函数替换using 1:2

set timefmt "%H:%M"
f(v) = substr(stringcolumn(v),12,16)
plot 'date1data.csv' using (f(1)):2 w lines lw 2 t "day1",\
     'date2data.csv' using (f(1)):2 w lines lw 2 t "day2"

enter image description here

答案 1 :(得分:0)

这是一个解决方案,它使用stats命令查找两个数据文件中的最早时间,并移动第二个文件的时间,以便与第一个文件中的最早时间保持一致。我们必须解决stats命令的限制,因为它在timedata模式下不起作用,但我们可以通过自己进行时间到秒的转换来解决这个问题:

set datafile separator ","
fmt = "%Y.%m.%d.%H:%M"
stats "date1data.csv" u (strptime(fmt,strcol(1)))
t1min = STATS_min
stats "date2data.csv" u (strptime(fmt,strcol(1)))
t2min = STATS_min

set xdata time
set format x "%H:%M"
plot 'date1data.csv' using (strptime(fmt,strcol(1))):2 w lines lw 2 t "day1", \
     'date2data.csv' using (strptime(fmt,strcol(1))-t2min+t1min):2 w lines lw 2 t "day2"

enter image description here 这种方法的优点是即使数据跨越日期边界也应该有效。

答案 2 :(得分:0)

您可以通过减去午夜来删除数据中的日期部分:

t(x) = x - 24*3600*(floor(x/(24*3600))

plot dataf1 us (t($1)):2, dataf2 us (t($1)):s

这实际上100%正确工作,因为unix时间忽略了闰秒,你的计算机时钟只是在一个发生时调整自己。