gnuplot打印带有统计信息的列标题

时间:2018-07-29 09:14:08

标签: gnuplot

gnuplot stats命令可用于报告输入数据集的统计信息。它创建一组变量,其中包含有关数据集中特定列的信息。 Here是这种用法的一个例子:

    set print "StatDat.dat" 
    do for [i=2:9] { # Here you will use i for the column.
      stats  'data.dat' u i nooutput ; 
      print i, STATS_median, STATS_mean , STATS_stddev # ...
    } 
    set print
    plot "StatDat.dat" us 1:2 # or whatever column you want...

包含报告的列标题会很有用,例如:

      print STATS_columnheader, STATS_median, STATS_mean , STATS_stddev # ...

但是gnuplot没有提供必需的STATS_columnheader变量。

是否有另一种方法可以实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以使用外部工具,例如awk来提取并返回列标题。您可以创建如下函数:

columnheading(f,c) = system("awk '/^#/ {next}; {print $".c.";exit}' ".f)

,在给定文件f和列号c的情况下,

将返回列标题。您将像这样使用它:

print columnheading('StatDat.dat',i).' ', STATS_median, STATS_mean , STATS_stddev # ...

awk表达式会跳过所有行,直到第一条非注释行,然后输出c参数给定的单词并退出。 gnuplots system命令返回打印的单词。

答案 1 :(得分:0)

解决方法

一个快速且肮脏的解决方案已表达为对答案this的评论:
可以将所有标头行一次存储一次 ,然后在需要时调用它。

在* nix下,如果在第10 行中,则可以使用headhead -n 10| tail -n 1之类的组合...

在此示例中进行了修改:

firstrow = system('head -1 '.datafile)          # you call here only one time
set print "StatDat.dat" 
do for [i=2:9] {                                # Here you will use i for the column.
  stats datafile u i nooutput ; 
  print word(firstrow, i), " ", STATS_median, STATS_mean , STATS_stddev 
                                                # or whatever you want...
} 
set print
plot "StatDat.dat" us 1:2                       # or whatever column you want...

请注意 gnuplot 函数word将返回字符串中的第n 个单词,因此如果标头是由多个词组成的...
...您可以使用here

解决的问题

仅是破解/欺骗的路径

以下操作无效,因为gnuplot在跳过标题和注释行之后开始在plot命令中处理文件...

由于函数可以采用f(x) = (statement1, statement2, statement3, return value)形式执行语句并返回值(other tricks),因此可以映像以构建存储第一行“字段由字段”的函数(以gnuplot 5.1的形式see, e.g.,通过其他技巧directly),也许用set terminal unknown隐藏该图。

array MyHeader[4]
f(x,y,z) = (x == 0 ? (MyHeader[y]=z, z ) : z)

set terminal unknown  # set terminal dumb
set key autotitle columnhead
do for [i=2:4] {                    # Here you will use i for the column.
  plot datafile using 1:(f($0,i,column(i)))
} 
print MyHeader

不幸的是,以上脚本仅存储第一行值...
但就目前而言,我已经可以解决这个问题了:-(
(也许有人可以找到有用的提示或完成提示)。