Как избежать рисования непоследовательных значений временного ряда, используя кумулятивные значения y на графике с линиями - PullRequest
0 голосов
/ 24 марта 2020

Для этих данных:

02/29/2020|2
03/01/2020|1
03/06/2020|1
03/07/2020|1
03/11/2020|5
03/12/2020|3

как вы можете изобразить что-то вроде этого:

пример графика

Как видите, мой x время переходит с 7 марта на 11 марта, поэтому простой with lines соединит точку 7 марта с точкой 11 марта, я не хочу такого поведения. Наконец, как вы можете построить так, чтобы пары x и y были такими

02/29/2020|2
03/01/2020|3
03/06/2020|4
03/07/2020|5
03/11/2020|10
03/12/2020|13

, где y продолжает добавлять свои предыдущие значения:

1 Ответ

0 голосов
/ 24 марта 2020

Можете ли вы добавить пустые строки в ваши данные? Тогда вы могли бы сделать это так:

Код:

### plot cumulated data over time
reset session

myTimeFmt = "%m/%d/%Y"
set datafile separator "|"

$Data <<EOD
02/29/2020|2
03/01/2020|1

03/06/2020|1
03/07/2020|1

03/11/2020|5
03/12/2020|3
EOD

set format x "%m/%d" time
set style line 1 pt 7 lc rgb "red"
set yrange [0:]
set key top left

mySum = 0
plot $Data u (timecolumn(1,myTimeFmt)):(mySum=mySum+$2) w lp ls 1 title "cumulative"
### end of code

Результат:

enter image description here

Добавление:

Если вам нужно вставить строки emtpy между непоследовательными днями, вы можете сделать это также с помощью gnuplot.

### plot cumulated data over time (+ insert emtpy line after non-consecutive days)
reset session

myTimeFmt = "%m/%d/%Y"
set datafile separator "|"

Data = "$Data"          # if your data is in a file
# Data = "'Data.dat'"   # uncomment this line and enter your filename
                        # and skip the following datablock
$Data <<EOD
02/29/2020|2
03/01/2020|1
03/06/2020|1
03/07/2020|1
03/11/2020|5
03/12/2020|3
EOD

# create data with whitespace as column separator
set table $Data2
    plot @Data u (strcol(1)):2 w table
unset table

# with emtpy line between two non-consecutive days
set print $Data3
    do for [i=1:|$Data2|-1] {
        if (strptime(myTimeFmt,word($Data2[i+1],1)) > \
            strptime(myTimeFmt,word($Data2[i],1))+86400) \
           {print $Data2[i]; print '' }
        else {print $Data2[i]}
    }
    print $Data2[|$Data2|]
set print
print $Data3

set datafile separator whitespace
set format x "%m/%d" time
set style line 1 pt 7 lc rgb "red"
set yrange [0:]
set key top left

mySum = 0
plot $Data3 u (timecolumn(1,myTimeFmt)):(mySum=mySum+$2) w lp ls 1 title "cumulative"
### end of code

Результат: (как указано выше)

...