在gnuplot中拟合时间数据的子范围

时间:2019-01-20 20:21:51

标签: gnuplot

首先让我说我正在努力:

  

$ gnuplot --version

     

gnuplot 5.2补丁程序级别2

我想在gnuplot中绘制和拟合日期/时间数据,并且只执行拟合,然后将其显示在该图的子范围内。

我玩过的示例数据可以例如被发现here编辑:我意识到文件中的数据与timefmt签名不匹配,我在每行中添加了一个/06,以便将点绘制在中间可以很好地将其与来自同一来源的每月数据一起绘制。

我可以使用下面的代码获得所需的结果,在该代码中我绘制了三个函数,一个在整个绘图范围内,而另外两个仅覆盖了部分日期范围。

set key left
set yrange[-0.75:1.0]
set xdata time
set timefmt '%Y/%m'
r=10e-10
e(x) = r*x+s
fit e(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via r,s
a=10e-10
f(x) = a * x + b
set xrange ["1970/06":"2018/06"]
fit f(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via a,b
g(x) = ( x > "1970/06" ) ? f(x) : 1/0
set xrange ["1850/06":"1970/06"]
c=9.24859e-11
h(x) = c * x + d
fit h(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via c,d
i(x) = ( x < "1970/06" ) ? h(x) : 1/0
set xrange ["1849/06":"2018/06"]
set term png size 1500,1000
set output 'annual_average_with_fit.png'
plot 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', e(x) t'full range fit' lw 2, i(x) t'1850-1970 fit' lw 2, g(x) t'1970-2018 fit' lw 2

产生此图

enter image description here

这一切都很好,但是,(这就是问题所在)原则上我应该也可以通过其他方式达到相同的结果。

首先:我将文件数据的范围限制为一定范围,以使其仅适合该范围。原则上,我应该可以使用以下(类型的)语法进行相同的操作:

fit ["1970/06":"2018/06"] f(x) 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 via a,b

却给出

  

阅读168分

     

跳过范围168点[x = 1970:2018]

     

[...]没有适合的数据

鉴于set xrange显然具有理想的效果,这似乎很奇怪。

第二次尝试使用

将曲线的绘制限制在拟合范围内
plot 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt' using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', ["1970/06":"2018/06"] f(x) t'' 

根本不绘制函数。

我可能会忽略一些非常基本的内容,但是尝试了各种方法后,我看不出它是什么

1 个答案:

答案 0 :(得分:1)

下面的代码(经过一些清理)应该可以满足您的要求(在gnuplot 5.2.5中进行了测试)。 我想问题是您试图拟合范围os.environ["Key"] = Value ,但您的数据仅到2017年。因此,最好保持开放状态,例如["1970/06":"2018/06"]["1970/06":]

编辑:添加了有限范围拟合i(x)

["1970/06":*]

输出: enter image description here