Полагаю, я наконец понял это сейчас.Однако есть несколько уроков, которые я до сих пор не понимаю полностью.
1.Чтобы получить кумулятивные данные, вы не должны устанавливать
set table $DataCumulative
plot $Data u (stringcolumn(1)):2 smooth cumulative with table
unset table
, но вместо этого:
set table $DataCumulative
plot $Data u (stringcolumn(1)):2 smooth cumulative
unset table
обратите внимание на пропущенный «with table
» в команде plot.Первая версия предоставляет вам исходные данные, вторая - желаемые совокупные данные.Но я пока не понимаю, почему.
2.настройка разделителя файла данных по умолчанию, которая
set datafile separator whitespace
, похоже, не работает.Вместо этого будет выдано сообщение об ошибке типа line xxx: No data to fit
, вам придется установить
set datafile separator " \t" # space and TAB
Но я не понимаю, почему.
3.дата подгонки
f_lin(x) = m*x + c
совсем не подойдет.Видимо, вам нужно вычесть дату начала и сделать примерку.
f_lin(x) = m*(x-strptime("%d.%m.%Y", Date_Start)) + c
Я помню, как читал это давным-давно в документации gnuplot, но больше не могу ее найти.
ДляВ настоящее время я доволен следующим:
Измененный код:
### generate random date between two dates
reset session
# function for creating a random date between two dates
t(date_str) = strptime("%d.%m.%Y", date_str)
date_random(d0,d1) = strftime("%d.%m.%Y",rand(0)*(t(d1)-t(d0)) + t(d0))
# create some random date data
Date_Start = "01.01.2018"
Date_End = "30.06.2018"
set print $Data
do for [i=1:100] {
print sprintf("%s\t%g", date_random(Date_Start,Date_End), floor(rand(0)*10-6))
}
set print
set xdata time
set timefmt "%d.%m.%Y"
# get cumulative data into datablock
set xtics format "%d.%m.%Y"
set table $DataCumulative
plot $Data u (stringcolumn(1)):2 smooth cumulative
unset table
set xtics format "%b"
set datafile separator " \t" # space and TAB
# linear function and fitting
f_lin(x) = m*(x-strptime("%d.%m.%Y", Date_Start)) + c
set fit nolog quiet
fit f_lin(x) $DataCumulative u 1:2 via m,c
Level_Start = 500
Level_End = 0
x0 = (Level_End - Level_Start - c)/m + strptime("%d.%m.%Y", Date_Start)
set multiplot layout 3,1
# event plot & cumulative plot
set xrange[Date_Start:"31.12.2018"]
set xtics format ""
set lmargin 7
set bmargin 0
plot $Data u (timecolumn(1,"%d.%m.%Y")):2 smooth frequency with impulses lc rgb "red" t "Events 2018"
set xtics format "%b"
set bmargin
plot $Data u (timecolumn(1,"%d.%m.%Y")):2 smooth cumulative w l lc rgb "web-green" t "Cumulated Events 2018"
# fit & extrapolation plot
set label 1 at x0, graph 0.8 strftime("%d.%m.%Y",x0) center
set arrow 1 from x0, graph 0.7 to x0, Level_End
set key at graph 0.30, graph 0.55
set xrange[Date_Start:x0+3600*24*50] # end range = extrapolated date + 50 days
set xtics format "%m.%y"
set yrange [-90:]
plot $DataCumulative u (timecolumn(1,"%d.%m.%Y")):($2+Level_Start) w l lc rgb "blue" t "Cumulated Events",\
Level_End w l lc rgb "red" not,\
f_lin(x)+Level_Start w l ls 0 t "Fitting \\& Extrapolation"
unset multiplot
### end of code
приведет к: