gnuplot оверлейные графики в разные дни? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть два файла данных двух дней и того же времени

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 голосов
/ 17 мая 2018

Вот решение, которое использует команду stats, чтобы найти самое раннее время в двух файлах данных, и сдвигает времена второго файла так, чтобы оно совпало с самым ранним временем в первом файле. Мы должны обойти ограничения команды stats, потому что она не работает в режиме временных данных, но мы можем обойти это, выполнив преобразование времени в секунды самостоятельно:

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 Преимущество этого подхода в том, что он должен работать, даже если данные пересекают границы дат.

0 голосов
/ 17 мая 2018

Вы можете просто удалить часть даты из ваших данных, вычитая полночь:

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

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

Это на самом деле работает на 100% правильно, потому что время Unix игнорирует високосные секунды, часы вашего компьютера просто настраиваются, когда это происходит.

0 голосов
/ 16 мая 2018

Вы можете заменить using 1:2 функцией, которая удаляет часть даты строки времени, которая является столбцом 1:

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

...