代码之家  ›  专栏  ›  技术社区  ›  theozh

累积数据和gnuplot外推

  •  2
  • theozh  · 技术社区  · 6 年前

    # Date     Event
    04.12.2018 -4
    23.06.2018 5
    04.10.2018 3
    11.11.2018 -9
    08.03.2018 -4
    08.03.2018 2
    11.11.2018 -3
    

    我想总结这些事件,并进行(例如线性)外推,例如数据何时达到某个阈值(例如零)。

    看起来像 smooth frequency smooth cumulative 似乎是为了这个。 但我对以下几点感到困惑:

    a) 如何添加起始值(偏移),例如。 StartValue = 500

    plot $Data u (strftime("%d.%m.%Y",timecolumn(1,"%d.%m.%Y"))):($2+StartValue) smooth cumulative w l t "Cumulated Events"

    b) 如何获取累积数据?尤其是如果数据没有按日期排序?

    set table "DataCumulative.dat"
        plot $Data u (strftime("%d.%m.%Y",timecolumn(1,"%d.%m.%Y"))):2 smooth cumulative with table
    unset table
    

    这看起来和这个问题很相似( GNUPLOT: saving data from smooth cumulative "DataCumulative.dat" ,我预期的是唯一的日期,基本上是来自下方绘图的数据。如何得到这个?

    守则:

    ### start code
    reset session
    set colorsequence classic
    
    # 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:1000] {
        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"
    set xtics format "%b"
    set xrange[date_start:"31.12.2018"]
    
    set multiplot layout 2,1
        plot $Data u (strftime("%d.%m.%Y",timecolumn(1,"%d.%m.%Y"))):2 smooth frequency with impulses t "Events"
        plot $Data u (strftime("%d.%m.%Y",timecolumn(1,"%d.%m.%Y"))):2 smooth cumulative w l t "Cumulated Events"
    unset multiplot
    
    # attempt to get cumulative data into datablock
    set table "DataCumulative.dat"
        plot $Data u (strftime("%d.%m.%Y",timecolumn(1,"%d.%m.%Y"))):2 smooth cumulative with table
    unset table
    ### end of code
    

    情节: enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   theozh    6 年前

    我想,我现在终于明白了。然而,有几点我仍然不完全理解。

    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

    2. 默认的数据文件分隔符设置 那是

    set datafile separator whitespace
    

    它似乎不起作用。它将给出一条错误消息,如 line xxx: No data to fit

    相反,你必须设置

    set datafile separator " \t"  # space and TAB
    

    但我不明白为什么。

    拟合时间日期

    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
    

    将导致: enter image description here