8

我有这种格式的文件:

x y1 y2 y3 ei1 ei2 ei3 es1 es2 es3
1 4 5 4 7 7 2 4 7 7
2 7 3 3 3 8 3 3 3 8
3 2 1 4 4 9 6 4 4 9

我想生成类似于以下命令给出的图

plot "filename" using 1:2:5:8  with yerrorbars

但使用列标题(x、、y1和)ei1es1调用它们。如何才能做到这一点?

gnuplot 手册(记录using命令)的第 84 页内容如下:

Height Weight Age
val1   val1   val1
...    ...    ...

那么下面的绘图命令都是等价的

plot ’datafile’ using 3:1, ’’ using 3:2

plot ’datafile’ using (column("Age")):(column(1)), \
’’ using (column("Age")):(column(2))

plot ’datafile’ using "Age":"Height", ’’ using "Age":"Weight"

但是,当我尝试它们时,我只得到了行索引与它们自己的对比。

4

1 回答 1

5

快速浏览一下 gnuplot 4.4 vs gnuplot 4.6(当前稳定版本)的文档,看来您尝试使用的功能可能是在 gnuplot 4.5 中引入的(奇数是开发分支——当它们被认为稳定时,它们会增加到偶数)。可以想到的唯一方法是用其他语言编写一个简单的脚本,该脚本返回列号(到标准输出)。这是一个使用 python 的简单示例,尽管我很肯定awk如果您想留在全 POSIX 环境中,您可以这样做:

#python indexing is 0 based, gnuplot datafile indexing 1 based
COL_AGE=`python -c 'print(open("datafile").readline().split().index("AGE")+1)'`
COL_HEIGHT=`python -c 'print(open("datafile").readline().split().index("HEIGHT")+1)'`
plot "datafile" u COL_AGE:COL_HEIGHT

这个小脚本没有做任何花哨的事情(例如,它假设列标题在第一行),但是使用 python 的强大功能,进一步扩展脚本会很容易:

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f
   for line in f:
       if (line.strip()):
           print (line.split().index(sys.argv[2])+1)
           sys.exit(0)

现在您可以将此脚本称为: python script.py datafile AGE找出“AGE”在哪个列中。如果“AGE”不在任何列中,则这是一个错误。

于 2012-07-16T12:22:57.757 回答