通过数据头

时间:2017-06-27 18:36:17

标签: gnuplot

假设我的gnuplot脚本想要在数据中的特定点上放置标签或箭头。数据已在另一个程序中创建,它可以将它们编码到数据文件的标题行中。不幸的是gnuplot无法使用 columnheader(num)将数据拉出。

实施例。我创建直方图数据,包括均值,西格玛和一些极限值。编写数据文件的程序将其放入第一行。看起来像这样:(0.2743是平均值,3.0是异常值限制)

"Data" 0.2743 1.0
     0 "-INF ->  -5.0"      0   0.00
     1 " -5.0 ->  -4.5"      0   0.00
     2 " -4.5 ->  -4.0"      2   0.03
     3 " -4.0 ->  -3.5"      4   0.06
     4 " -3.5 ->  -3.0"      3   0.05
     5 " -3.0 ->  -2.5"      5   0.08
     6 " -2.5 ->  -2.0"     19   0.30
     7 " -2.0 ->  -1.5"     49   0.78
     8 " -1.5 ->  -1.0"    193   3.07
     9 " -1.0 ->  -0.5"    527   8.39
    10 " -0.5 ->  +0.0"   1289  20.53
    11 " +0.0 ->  +0.5"   1878  29.90
    12 " +0.5 ->  +1.0"   1411  22.47
    13 " +1.0 ->  +1.5"    636  10.13
    14 " +1.5 ->  +2.0"    178   2.83
    15 " +2.0 ->  +2.5"     56   0.89
    16 " +2.5 ->  +3.0"     17   0.27
    17 " +3.0 ->  +3.5"      9   0.14
    18 " +3.5 ->  +4.0"      4   0.06
    19 " +4.0 ->  +4.5"      0   0.00
    20 " +4.5 ->  +5.0"      0   0.00
    21 " +5.0 -> +INF"      0   0.00

现在我尝试从脚本中引用它来创建绘图中的箭头。

...
mean= columnheader(2)
sdev= columnheader(3)
lboffs= 0.2
set arrow  from 11.0 + mean,0.0 to 11.0 + mean ,GPVAL_DATA_Y_MAX*1.2 nohead lw 2 lc rgb "dark-green"
set arrow  from 11.0 + mean - 3 * sdev,0.0 to 11.0 + mean - 3 * sdev ,GPVAL_DATA_Y_MAX*1.2 nohead lw 2 lc rgb "red"
set arrow  from 11.0 + mean + 3 * sdev,0.0 to 11.0 + mean + 3 * sdev ,GPVAL_DATA_Y_MAX*1.2 nohead lw 2 lc rgb "red"
set arrow  from 11.0,0.0 to 11.0,GPVAL_DATA_Y_MAX*1.2 nohead lw 2 lc rgb "blue"
set label "Mean" at 11.0 + mean + lboffs,GPVAL_DATA_Y_MAX*1.1 tc rgb "dark-green"
set label "+3%"  at 11.0 + mean + 3 * sdev + lboffs,GPVAL_DATA_Y_MAX*1.1 tc rgb "red"
set label "-3%"  at 11.0 + mean - 3 * sdev + lboffs,GPVAL_DATA_Y_MAX*1.1 tc rgb "red"
...

原来这不起作用。

gnuplot> mean= columnheader(2)
         undefined function: columnheader

gnuplot> sdev= columnheader(3)
         undefined function: columnheader

缺少什么?或者有更好的方法将变量输入gnuplot吗?

谢谢, 格特

1 个答案:

答案 0 :(得分:0)

函数columnheaderplot上下文之外不起作用。但是,有几个选项可以访问数据文件第一行中的值。

例如,您可以使用外部处理:

fName = 'input.dat'

getColumn(n)=system(sprintf("head -n1 %s | awk '{print $%d}'", fName, n))*1.
mean = getColumn(2)
std = getColumn(3)

或者,您可以将stats命令与every结合使用,以便仅选择第一行:

stats fName every ::0::0 using 2:3 nooutput
mean = STATS_min_x
std = STATS_min_y