#gnuplot
#gnuplot
Вопрос:
Я пытаюсь создать линейную диаграмму с помощью Gnuplot. Мне нужно получить что-то вроде следующего, но с исключением:
В приведенном выше примере вы можете видеть прямую линию, которая соединяет две отдельные точки над пустыми данными. Это тот, который пересекает отметку x ‘2016-09-27 00:00:00’. Я бы хотел, чтобы вместо этой прямой было пустое пространство. Как я мог этого добиться?
Это текущий код:
set xdata time
set terminal pngcairo enhanced font "arial,10" fontscale 1.0 size 900, 350
set output filename
set key off
set timefmt '"%Y-%m-%d %H:%M:%S"'
set format x "%Y-%m-%d %H:%M"
set xtics rotate by -80
set mxtics 10
set datafile missing "-"
set style line 1 lt 2 lc rgb 'blue' lw 1
set style line 2 lt 2 lc rgb 'green' lw 1
set style line 3 lt 2 lc rgb 'red' lw 1
plot
fuente using 1:2 ls 1 with lines,
fuente using 1:3 ls 2 with lines,
fuente using 1:4 ls 3 with lines
Ответ №1:
Три варианта:
- В файле данных поместите пустую строку там, где находится пробел. Это приводит именно к тому, что вы хотите, но также повлияет на другие данные из этого файла.
-
Используйте
every
только для отображения части данных и отображения ее дважды, один раз до разрыва, один раз от разрыва. Предположим, что в вашем случае разрыв возникает между точками данных 42 и 43, тогда вы могли бы использовать:plot fuente using 1:2 ls 1 every ::::41 with lines, fuente using 1:2 ls 1 every ::42 with lines, fuente using 1:3 ls 2 with lines, fuente using 1:4 ls 3 with lines
(
every
Оператор принимает до шести аргументов, разделенных двоеточиями, но вы можете оставить их пустыми для значений по умолчанию. Пятый аргумент — это конечная точка, третий — начальная точка.) -
Если вы используете
-
для отсутствующих данных в вашем файле (как указано в вашемset datafile missing "-"
), вы должны изменить свой оператор using, чтобы это было эффективным:plot fuente using 1:($2) ls 1 with lines, fuente using 1:3 ls 2 with lines, fuente using 1:4 ls 3 with lines
Ответ №2:
Конечно, вы всегда можете изменить свои данные и, например, вставить пустые строки (как предложил @Wrzlprmft), когда данные отсутствуют, что приведет к прерыванию вашей строки. При больших наборах данных и большом количестве «разрывов» это было бы болезненно, если бы вам пришлось делать это вручную. Я бы сказал, что есть решение без изменения ваших данных.
Позвольте мне спросить: «Что вы считаете недостающими данными?»
Мое предположение было бы следующим: у вас есть, например, регистратор данных, который принимает значения каждые 10 минут. Если по какой-либо причине регистратор не принял некоторые данные, возникнет «пробел» в отсутствующих данных. Теперь вы можете определить, что вы считаете пробелом, например, > 1 час отсутствия данных будет разрывом.
Следовательно, вы просто сравниваете два последовательных значения t0
, t1
и, если разница больше, чем ваш пробел, вы меняете цвет линии с любого цвета на прозрачный (в соответствии со схемой 0xaarrggbb
). Проверьте help linecolor variable
и help colorspec
.
Скрипт:
### don't show line in missing data gaps
reset session
myFmt = "%Y-%m-%d %H:%M"
# create some random test data
set print $Data
tStart = "2016-09-27"
tEnd = "2016-10-10"
t0 = strptime(myFmt,tStart)
t1 = strptime(myFmt,tEnd)
y0 = 100
do for [t=t0:t0 (t1-t0)*0.2:600] { print sprintf("%s %g",strftime(myFmt,t),y0=y0 (rand(0)-0.5)) }
do for [t=t0 (t1-t0)*0.3:t0 (t1-t0)*0.5:600] { print sprintf("%s %g",strftime(myFmt,t),y0=y0 (rand(0)-0.5)) }
do for [t=t0 (t1-t0)*0.8:t0 (t1-t0):600] { print sprintf("%s %g",strftime(myFmt,t),y0=y0 (rand(0)-0.5)) }
set print
set format x "%d.%m." timedate
gap = 3600 # 1 hour
myColor(tCol,color) = (t0=t1, t1=timecolumn(tCol,myFmt), t1-t0>gap ? 0xff123456 : color)
set multiplot layout 2,1
plot $Data u (timecolumn(1,myFmt)):3 w l lc rgb 0xff0000 ti "data as is"
plot t1=NaN $Data u (timecolumn(1,myFmt)):3:(myColor(1,0x0000ff)) w l lc rgb var ti "with removed gaps"
unset multiplot
### end of script
Результат: