我有这种格式的文件:
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
,ei1
和es1
)来调用它们。
怎么办呢?
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"
然而,当我尝试它们时,我只得到行指数与自己。
答案 0 :(得分:5)
快速浏览一下gnuplot 4.4 vs 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”不在任何列中,则会出错。