Построить линию прогноза с Gnuplot? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть эти данные:

Serv1;2019-10;2561.36
Serv1;2019-11;3292.65
Serv1;2019-12;3077.58
Serv1;2020-01;3369.98
Serv1;2020-02;3134.53
Serv1;2020-03;593.332

С помощью Excel я могу создать график с прогнозной линией на Excel, например:

enter image description here

Я могу создать график с помощью gnuplot: enter image description here

С помощью этого сценария gnuplot:

set title "test"
set terminal png truecolor size 960,720 background rgb "#eff1f0"
set output "/xxx/xxx/xxx/xxx/xxx/test.png"
set grid
set style line 1 \
    linecolor rgb '#0060ad' \
    linetype 1 linewidth 2 \
    pointtype 7 pointsize 1.5

set offsets 0.5,0.5,0,0.5
set datafile separator ";"
set key left


plot "test.txt" using 3:xtic(2) with linespoints linestyle 1

Но Я не знаю, как построить линию прогноза с Gnuplot ...

Не могли бы вы показать мне, как это сделать?

1 Ответ

1 голос
/ 02 марта 2020

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

Редактировать:

Нет функции gnuplot для получить значение данных определенной строки и столбца, например, как a = value(row,column). Вы должны использовать какой-то странный обходной путь. По сути, вы выстраиваете свои данные в фиктивную таблицу, но только первый элемент данных первого блока первого набора данных (отсчет начинается с 0). Проверьте help every и help index.

set table $Dummy
    plot $Data u (StartDate=timecolumn(1,myTimeFmt)) index 0 every ::0:0:0:0 w table
unset table
print sprintf("StartDate: %s",strftime(myTimeFmt,StartDate))

Результат: StartDate: 01/03/2020

Код:

### linear fit and extrapolation
reset session

$Data <<EOD
01/03/2020,100
02/03/2020,150
03/03/2020,125
04/03/2020,150
05/03/2020,175
06/03/2020,200
07/03/2020,220
08/03/2020,150
09/03/2020,175
10/03/2020,125
11/03/2020,150
12/03/2020,200
13/03/2020,210
14/03/2020,230
EOD

set datafile separator comma
myTimeFmt = "%d/%m/%Y"
set format x "%d.%m." time

# put start date into variable StartDate
set table $Dummy
    plot $Data u (StartDate=timecolumn(1,myTimeFmt)) index 0 every ::0:0:0:0 w table
unset table

EndDate   = strptime("%Y-%m","30/04/2020")
f(x) = a*(x-StartDate)+ b
set fit quiet nolog
fit f(x) $Data u (timecolumn(1,myTimeFmt)):2 via a,b 

set xrange[StartDate:EndDate]
set grid xtics, ytics

plot $Data u (timecolumn(1,myTimeFmt)):2 w lp pt 7 lc rgb "red" notitle, \
     [StartDate:EndDate] f(x) ti "linear fit with extrapolation"
### end of code

Результат :

enter image description here

Редактировать 2: (версия для gnuplot 4.6)

Изменено для gnuplot 4.6 , Где я обнаружил проблемы и узнал позже, это параметр FIT_LIMIT = 1e-8, который вам нужно установить для подгонки временных данных.

Данные: (Data.dat)

Serv1;2019-10;2561.36
Serv1;2019-11;3292.65
Serv1;2019-12;3077.58
Serv1;2020-01;3369.98
Serv1;2020-02;3134.53
Serv1;2020-03;593.332

Код:

### linear fit and extrapolation, version for gnuplot 4.6
reset

FILE = "Data.dat"
set datafile separator ";"
set xdata time
set timefmt "%Y-%m"
set format x "%Y\n%m"

# put start date into variable StartDate, dummy plot
plot FILE u (StartDate=timecolumn(2)):0 index 0 every ::0:0:0:0

EndDate = strptime(myTimeFmt,"2020-09")
f(x) = a*(x-StartDate) + b
FIT_LIMIT = 1e-8
fit f(x) FILE u (timecolumn(2)):3 via a,b 

set xrange[StartDate:EndDate]
set grid xtics, ytics
set yrange[0:4000]

plot FILE u (timecolumn(2)):3 w lp pt 7 lc rgb "red" notitle, \
      f(x) ti "linear fit with extrapolation"
### end of code

Результат:

enter image description here

...