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
Привет, Кристоф, это моя проблема. Если я нахожусь в 8:00 утра 30 дня и устанавливаю xrange на последние 24 часа, gnuplot будет рисовать линию с 8:00 утра 29 дня до 8:00 утра 30 дня. Я не могу понять, почему включен день 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