Избегайте соединения точек при наличии пустых данных

#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
  

Результат:

введите описание изображения здесь