通过使用GnuPlot调用列标题打印列

通过使用GnuPlot调用列标题打印列,gnuplot,Gnuplot,我有以下格式的文件: 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 我希望生成与以下命令类似的绘图 给予 但是使用列标题(x、y1、ei1和es1)调用它们。 如何做到这一点 gnuplot手册第84页(使用命令记录)内容如下: 然后,以下绘图命令都是等效的 使用3:1绘制“数据文件”,使用3:2绘制“数据文件” 使用(列(“年龄”):(列(1))绘制

我有以下格式的文件:

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
我希望生成与以下命令类似的绘图 给予

但是使用列标题(
x
y1
ei1
es1
)调用它们。 如何做到这一点

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

然后,以下绘图命令都是等效的

使用3:1绘制“数据文件”,使用3:2绘制“数据文件”
使用(列(“年龄”):(列(1))绘制“数据文件”\
“”使用(列(“年龄”):(第(2)列)
使用“年龄”打印“数据文件”:“高度”,使用“年龄”打印“数据文件”:“重量”

然而,当我尝试它们时,我只得到了与它们相对应的行索引。

快速查看一下gnuplot 4.4与gnuplot 4.6(当前稳定版本)的文档,似乎您尝试使用的功能可能是在gnuplot 4.5中引入的(奇数是开发分支——当它们被认为是稳定的时,它们会增加到偶数)。实现这一点的唯一方法是用其他语言编写一个简单的脚本,返回列号(到stdout)。下面是一个使用python的简单示例,尽管我确信如果您想保持在全POSIX环境中,您可以在
awk
中执行此操作:

#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”不在任何列中,则是错误的。

使用1:2:5:8和yerrorbars
打印“filename”,并使用“x”:“y1”:“ei1”:“es1”使用yerrorbars在这里产生相同的结果。您运行的是哪个版本的Gnuplot,我在Gnuplot 4.6 patchlevel 0中进行了测试。Ubuntu附带的4.4 patchlevel 3版本。它是否太旧了?是的,您需要4.6或更高版本来实现此功能。@Thor——可能4.5版本也可以工作,尽管现在很难获得该版本 ;)
#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
#!/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)