Gnuplot - Как да не начертаете част от линия за несъседни дата/час

Опитвам се да начертая последните 24 часа от файла с данни. Този файл с данни има дата/час и стойност

По-долу е съдържанието на datafile.dat:

2015-12-17-21:07:41,74.30
2015-12-17-21:08:41,74.10
2015-12-17-21:08:41,74.10
2015-12-30-21:08:41,79.10
2015-12-30-21:09:41,79.10
....

под gnuplot скрипт

set datafile separator ","
set terminal png font arial 12 size 1000,600
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [ time(0) - 86400 : time(0) ]    # 86400 sec = 1 day 
set grid
set output "/data/weather/humidity.png"
plot "datafile.dat" using 1:2 with lines smooth bezier title "" 

Тъй като нямам данни във файла за ден 29, защо gnuplot чертае линия от ден 29 до ден 30? Нямам редове във файла с данни за ден 29 и бих искал да не ги рисувам. Ако нямам 24 часа данни във файла, бих искал да начертая точно това, което имам.

Как мога да направя това?


person user1680012    schedule 30.12.2015    source източник
comment
Как трябва gnuplot да разбере, че липсва точка от данни?   -  person Christoph    schedule 31.12.2015
comment
Обикновено, за да прекъснете линия, трябва да вмъкнете точка с невалидна стойност като NaN. Но вероятно ще имате проблеми с изглаждането, защото smooth bezier начертава един безие от порядък n-1 през всички n точки.   -  person Christoph    schedule 31.12.2015
comment
Здравей Кристоф, това е моят проблем. Ако съм в ден 30 8:00 сутринта и задам xrange да издържа 24 часа, gnuplot ще начертае линия от ден 29 8:00 сутринта до ден 30 8:00 сутринта. Не мога да разбера защо е включен ден 29, ако нямам данни за ден 29. Ако файлът ми с данни има данни за дни, 30, 17, 16, 15... за мен има смисъл gnuplot да тегли чертата само от ден 30 0 :00 сутринта до ден 30 8:00 сутринта. Знам, че това е по-малко от 24 часа, но всъщност нямам непрекъснати данни през последните 24 часа, така че защо gnuplot да не начертае точно това, което имам?   -  person user1680012    schedule 01.01.2016


Отговори (1)


Gnuplot има опция set clip, която контролира как се чертаят линиите, свързващи точки извън дадения диапазон: set clip one, което е по подразбиране, чертае линии между две точки, ако една от точките е в диапазона. Линията е подрязана на границата на парцела. set clip two ще начертае части от линия, дори ако и двете точки са извън обхвата, но линията минава през областта на начертаване.

Използвайте unset clip, за да изчертаете само линии между точки, които и двете са в обхват.

set datafile separator ","
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [ time(0) - 86400 : time(0) ]
unset clip
plot "datafile.dat" using 1:2 with lines title "" 

За съжаление, това не работи правилно с изглаждането, тъй като gnuplot първо извършва изглаждането между всички точки (в обхвата и извън обхвата), а след това само прилага правилата за изрязване. За да имате манипулаторите за изглаждане правилно, трябва да филтрирате точките, преди да ги обработите в gnuplot, напр. с awk:

set datafile separator ","
set xdata time
set timefmt "%Y-%m-%d-%H:%M:%S"
set format x "%d/%m\n%H:%Mh"
set xrange [time(0) - 86400 : time(0)]

filter = '< awk -F, -v d="$(date -d''24 hours ago'' +''%F-%T'')" ''$1>=d'' datafile.dat'
plot filter using 1:2 with lines smooth bezier title "" 

Обърнете внимание, че сравнението $1 >= d в awk е сравнение на низове, но това е добре за формата на времето, който използвате.

person Christoph    schedule 01.01.2016