如何处理数据文件,控制适合x轴延伸和适合后勤

时间:2013-12-06 03:58:43

标签: gnuplot

我有一个long.dat文件如下。

#x1      y1     sd1      x2       y2    sd2      x3       y3    sd3
2.50    9.04    0.03    2.51    16.08   0.04    2.50    26.96   0.07
2.25    9.06    0.05    1.84    16.01   0.16    1.91    26.94   0.21
1.11    9.12    0.19    1.06    15.90   0.14    1.30    26.41   0.10
0.71    9.97    0.18    0.86    16.47   0.33    0.92    28.59   0.92
0.60    11.36   0.24    0.77    17.31   0.18    0.73    33.55   1.40
0.56    12.44   0.55    0.72    18.25   0.25    0.65    37.82   2.16
0.50    14.23   0.37    0.71    18.73   0.49    0.57    44.75   2.69
0.43    16.93   1.20    0.63    20.55   0.64    0.51    52.11   1.01
0.38    19.18   1.12    0.57    22.27   0.94    0.47    58.01   2.17
0.32    24.83   2.26    0.52    25.04   0.53    0.42    65.92   2.62
0.30    28.87   1.39    0.46    29.75   2.41    0.38    71.60   1.81
0.25    34.23   2.07    0.41    37.92   1.49    0.34    75.81   0.68
0.21    39.52   0.53    0.37    43.33   1.81    0.32    77.12   0.68
0.16    44.10   1.81    0.32    47.22   0.57    0.28    79.87   2.03
0.13    49.73   1.19    0.28    49.36   0.99    0.22    85.93   1.32
0.13    49.73   1.19    0.22    53.94   0.98    0.19    89.10   2.14
0.13    49.73   1.19    0.18    57.28   1.56    0.16    96.48   1.28
0.13    49.73   1.19    0.14    63.66   1.90    0.14    100.09  1.46
0.13    49.73   1.19    0.12    67.92   0.64    0.12    103.90  0.48
0.13    49.73   1.19    0.12    67.92   0.64    0.12    103.90  0.48

我试图用二阶多项式拟合我的数据。

我遇到了问题

(1)我的x1,y1,sd1数据coluns比x2,y,sd2短。所以我不得不在x1 = 0.13处附加x1,y2,sd1。否则,文本文件正在做“某事”导致错误的绘图。有没有办法避免它而不是附加相同的值?

test.jpg (2)在我的绘图中,拟合f8(x)将最后一个值扩展到大约7.5,以匹配大约x = 8.25处的f12(x)。如果我设置我的x范围[0:100],则所有拟合都扩展到x = 100。我该怎么控制呢?

以下是代码,

Set key left
f8(x) = a8*x*x+b8*x+c8
fit f8(x) 'long.dat' u (1/$1):($2/800**3) via a8,b8,c8
plot f8(x), 'long.dat' u (1/$1):($2/800**3): ($3/800**3) w errorbars not

f10(x) = a10*x*x+b10*x+c10
fit f10(x) 'long.dat' u (1/$4):($5/1000**3) via a10,b10,c10
replot f10(x), 'long.dat' u (1/$4):($5/1000**3): ($6/1000**3) w errorbars not

f12(x) = a12*x*x+b12*x+c12
fit f12(x) 'long.dat' u (1/$7):($8/1200**3) via a12,b12,c12
replot f12(x), '' u (1/$7):($8/1200**3): ($9/1200**3) w errorbars not

(3)我试图在x1,y1数据集上使用logistic fit g(x)= a /(1 + b exp(-k x))但是几乎失败了!代码在这里,

Set key left
g(x) = a/(1+b*exp(-k*x))
fit g(x) 'long.dat' u (1/$1):($2/800**3) via a,b,k
plot g(x), 'long.dat' u (1/$1):($2/800**3): ($3/800**3) w errorbars not

任何评论/建议都将受到高度赞赏!非常感谢您提前通过这篇重要文章和任何反馈意见!

2 个答案:

答案 0 :(得分:2)

1)您可以使用NaN关键字作为缺失点:gnuplot将忽略它们

2)如果您要绘制的是一个函数,根据定义它是为每个x定义的,因此它将全面扩展

您可能想要做的是将拟合点存储在文件中,例如:

set table "func.txt"
plot [0.5:7.5] f(x)
unset table

然后绘制文件而不是函数。您可能希望使用数据文件的示例来调整结果:键入“help samples”

答案 1 :(得分:1)

除了@ bibi的答案之外还有一些建议:

  1. gnuplot应该如何知道,在某一行遇到的第一个数字属于第4列?为此您可以使用例如逗号作为列分隔符:

    0.16, 44.10, 1.81, 0.32, 47.22, 0.57, 0.28, 79.87, 2.03
    0.13, 49.73, 1.19, 0.28, 49.36, 0.99, 0.22, 85.93, 1.32
        ,      ,     , 0.22, 53.94, 0.98, 0.19, 89.10, 2.14
    

    告诉gnuplot:

    set datafile separator ','
    
  2. 所有函数都使用相同的xrange绘制。当超出所需范围时,您可以通过返回1/0对函数使用不同的限制:

    f(x) = a*x**2 + b*x + c
    f_p(x, min, max) = (x >= min && x <= max) ? f(x) : 1/0
    plot f_p(x, 0.5, 7.5)
    

    您可以使用stats来提取限制:

    stats 'long.dat' using (1/$1) name 'A_' nooutput
    plot f_p(x, A_min, A_max)
    
  3. 对于拟合,gnuplot使用1作为参数的起始值,如果尚未为它们指定显式值。你可以想象,a=11e-7的价值不太接近。a=1e-7; b = 50; k = 1。对于非线性拟合,对于所有起始值,不存在唯一的唯一解。所以关于找到正确的起始值和正确的模型函数。

    使用起始值{{1}},您可以获得解决方案,但合适度不是很好。