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

在gnuplot中拟合时间数据的子范围,gnuplot,Gnuplot,首先,我要说的是,我正在致力于: $gnuplot--版本 gnuplot 5.2补丁级别2 我想在gnuplot中绘制和拟合日期/时间数据,并仅执行拟合,然后在绘图的子范围中显示 例如,可以找到我使用的示例数据。 >编辑< /强>:我意识到文件中的数据与 TimeFMT签名不匹配,我在每行中添加了一个 /06代码>,以便在年中绘制该点,允许它与来自同一源的月数据一起精确地绘制它。 我可以通过下面的代码获得所需的结果,其中我绘制了三个函数,一个在整个绘图范围内,另外两个都只覆盖部分日期范围 s

首先,我要说的是,我正在致力于:

$gnuplot--版本

gnuplot 5.2补丁级别2

我想在gnuplot中绘制和拟合日期/时间数据,并仅执行拟合,然后在绘图的子范围中显示

例如,可以找到我使用的示例数据。 <强> >编辑< /强>:我意识到文件中的数据与<代码> 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
然而,这给了

读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'' 
根本不绘制函数

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

下面的代码(稍微清理一下)应该做您想要做的事情(使用gnuplot 5.2.5测试)。 我想问题是您试图拟合一个范围
[“1970/06”:“2018/06”]
,但您的数据直到2017年。所以最好让它打开,例如
[“1970/06”:]
[“1970/06”:*]

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

输出:

该代码确实能满足我对指定命令的要求,而且显然比我的代码更清晰,因此我接受答案。不过,你对范围的猜测并不完全正确,如果我选择“2016/06”作为上限,这显然在范围内,我会得到同样的错误。因此,对于我的特定示例,开放范围可以很好地工作,但我想我的下一个问题是如何执行三次配合,其中中间的一次显然在两侧都有限制。你是对的。我没有料到这一点,我无法解释为什么它不能在两侧有限的范围内工作。好吧,但例如,使用
[strtime(“%Y/%m”,“1910/06”):strtime(“%Y/%m”,“1945/06”)]
似乎可以。我在上面的代码中添加了这个。
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'' 
reset session
set term png size 1500,1000
set output 'annual_average_with_fit.png'

set key left
set yrange[-0.75:1.0]
set xdata time
set timefmt '%Y/%m'
set format x '%Y'

FILE = 'HadCRUT.4.6.0.0.annual_ns_avg_smooth.txt'

r=10e-10
f(x) = r*x+s
fit [*:*] f(x) FILE using 1:2 via r,s

c=9.24859e-11
g(x) = c * x + d
fit [*:"1970/06"] g(x) FILE using 1:2 via c,d

a=10e-10
h(x) = a * x + b
fit ["1970/06":*]  h(x) FILE using 1:2 via a,b

p=1e-9
i(x) = p * x + q
fit [strptime("%Y/%m", "1910/06"):strptime("%Y/%m", "1945/06")] i(x) FILE using 1:2 via p,q

set xrange [*:*]
plot FILE using 1:2 with lp lw 2 t'annual avg (decadally smoothed)', \
    f(x) t 'full range fit' lw 2, \
    [:"1970/06"] g(x) t '1850-1970 fit' lw 2, \
    ["1970/06":] h(x) t '1970-2018 fit' lw 2,\
    [strptime("%Y/%m", "1910/06"):strptime("%Y/%m", "1945/06")] i(x) t '1910-1945 fit' lw 2

set output