Gnuplot l oop через строки данных, чтобы найти индекс - PullRequest
0 голосов
/ 11 апреля 2020

Составляя некоторые данные covid19 с помощью gnuplot, я пытаюсь найти способ выбрать необработанный фрагмент в моем наборе данных, чтобы использовать его в качестве отправной точки.

E. г. У меня есть что-то вроде:

#date       #cases
2010-03-01  11
2010-03-02  13
2020-03-03  17
2020-03-04  20
2020-03-05  29
2020-03-06  38
2020-03-07  50
2020-03-08  63
2020-03-09  82
2020-03-10  105
2020-03-11  140
2020-03-12  180
2020-03-13  240
...

Теперь я хочу найти дату, когда число дел стало больше 100, и использовать эту дату для корректировки / нормализации / любых других моих графиков.

Итак, я хочу найти строку «2020-03-10 105» и установить две переменные

start_date = '2020-03-10'
start_index = 11

, чтобы иметь возможность выполнять такие операции, как

stats <datafile> every ::start_index
set xrange [start_date:]
...

et c et c, чтобы в основном игнорировать все до даты> 100 дел.

Полагаю, возможно использование некоторого базиса c для +, если l oop выше r aws моего файла данных но я немного застрял с ним, так как не могу найти хороший пример / объяснение того, как перебрать файл данных r aws.

PS Конечно, я мог бы сделать это с помощью внешних инструментов, но я ' я бы предпочел этого не делать, так как я делаю некоторые пакетные графики с довольно большим количеством сценариев для сбора данных, и хотел бы, чтобы все графики построения c были в моем шаблоне gnuplot jinja2, чтобы не слишком усложнять весь процесс.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Другой вариант - применить фильтр к значению во втором столбце в части using команды plot. Это позволяет избежать использования every. Лично я не люблю использовать set xdata time; Я предпочитаю выполнять преобразования времени явно. Например, при этом будет отображена часть файла данных, для которой значение в столбце 2 больше 100:

  set xrange noextend        # limit range to exactly the data points
  tf = "%Y-%m-%d"
  set xtics time format tf
  plot 'data' using (($2>100) ? timecolumn(1,tf) : NaN): 2 with linespoints

, что дает график той части данных, которую вы хотите. Xrange точно охватывает выбранные даты. Первая выбранная дата может быть получена с помощью

  start_time = strftime(tf, GPVAL_DATA_X_MIN)
  print start_time
       2020-03-10

enter image description here

0 голосов
/ 11 апреля 2020

Я не эксперт по gnuplot, так что это может быть не лучшим способом. Вы можете go дважды просмотреть файл данных, один раз "поместив" его в фиктивный массив, но вызывая функцию f(y,row) в каждой строке. Функция берет точку данных (y) и номер строки и устанавливает переменную (начало) для запоминания строки, если точка данных превышает 100:

set xdata time
set timefmt "%Y-%m-%d"
start=0
f(y,row) = (y>=100 && start==0?(start=row,y):y)
set table $Data
  plot "data" using 1:(f($2,$0))
unset table
plot "data" every ::start using 1:2 with lines

Если вам нужен старт строковую дату, например, в качестве заголовка легенды, вы можете аналогичным образом расширить функцию с помощью дополнительного параметра и сохранить его:

...
startdate="???"
f(x,y,row) = (y>=100 && start==0?(startdate=x,start=row,y):y)
...
plot "data" using 1:(f(stringcolumn(1),$2,$0))
...