首先让我说我正在努力:
$ 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
产生此图
这一切都很好,但是,(这就是问题所在)原则上我应该也可以通过其他方式达到相同的结果。
首先:我将文件数据的范围限制为一定范围,以使其仅适合该范围。原则上,我应该可以使用以下(类型的)语法进行相同的操作:
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''
根本不绘制函数。
我可能会忽略一些非常基本的内容,但是尝试了各种方法后,我看不出它是什么