OSX v10.6.8和Gnuplot v4.4
我有一个包含8列的数据文件。我想从第6列获取第一个值并将其作为标题。这是我到目前为止所做的:
#m1 m2 q taua taue K avgPeriodRatio time
#1 2 3 4 5 6 7 8
K = #read in data here
graph(n) = sprintf("K=%.2e",n)
set term aqua enhanced font "Times-Roman,18"
plot file using 1:3 title graph(K)
以下是我的数据文件的前几行:
1.00e-07 1.00e-07 1.00e+00 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
1.11e-06 1.00e-07 9.02e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
2.12e-06 1.00e-07 4.72e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
3.13e-06 1.00e-07 3.20e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12090.00
我不知道如何正确读取数据,或者这是否是正确的解决方法。
编辑#1
好的,多亏了mgilson我现在有了
#m1 m2 q taua taue K avgPeriodRatio time
#1 2 3 4 5 6 7 8
set term aqua enhanced font "Times-Roman,18"
K = "`head -1 datafile | awk '{print $6}'`"
print K+0
graph(n) = sprintf("K=%.2e",n)
plot file using 1:3 title graph(K)
但是我收到了错误:找到了数字表达式的非数字字符串
编辑#2
file = "testPlot.txt"
K = "`head -1 file | awk '{print $6}'`"
K=K+0 #Cast K to a floating point number #this is line 9
graph(n) = sprintf("K=%.2e",n)
plot file using 1:3 title graph(K)
这给出了错误 - > head:file:没有这样的文件或目录 “testPlot.gnu”,第9行:找到预期数值表达式的非数字字符串
答案 0 :(得分:13)
你有几个选择......
第一个选项:
使用columnheader
plot file using 1:3 title columnheader(6)
我还没有测试过,但这可能会阻止第一行实际绘制。
第二个选项:
使用外部实用程序获取标题:
TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE
如果变量是数字,并且您想重新格式化它,在gnuplot中,您可以通过向它们添加0来将字符串强制转换为数字类型(整数/浮点数)(例如)。
print "36.5"+0
然后,您可以使用sprintf
或gprintf
对其进行格式化。
没有float
功能,这很奇怪。 (如果要转换为整数,则int
将起作用。)
修改强>
下面的脚本对我有用(当我将示例数据粘贴到名为“datafile”的文件中时):
K = "`head -1 datafile | awk '{print $6}'`"
K=K+0 #Cast K to a floating point number
graph(n) = sprintf("K=%.2e",n)
plot "datafile" using 1:3 title graph(K)
编辑2 (地址评论如下)
要在backtics中扩展变量,您需要使用宏:
set macro
file="mydatafile.txt"
#THE ORDER OF QUOTES (' and ") IS CRUCIAL HERE.
cmd='"`head -1 ' . file . ' | awk ''{print $6}''`"'
# . is string concatenation. (this string has 3 pieces)
# to get a single quote inside a single quoted string
# you need to double. e.g. 'a''b' yields the string a'b
data=@cmd
要解决您的问题2,最好熟悉shell实用程序 - sed和awk都可以这样做。我将展示头/尾的组合:
cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'
应该有用。
编辑3
我最近了解到,在gnuplot中,system
既是一个函数,也是一个命令。没有所有的辩论体操,要做到这一点,
data=system("head -1 " . file . " | awk '{print $6}'")
哇,好多了。
答案 1 :(得分:4)
这是一个非常古老的问题,但这是一种在数据文件中的任何位置访问单个值并将其保存为gnuplot可访问变量的好方法:
set term unknown #This terminal will not attempt to plot anything
plot 'myfile.dat' index 0 every 1:1:0:0:0:0 u (var=$1):1
index
号码允许您处理特定数据集(由两个回车符分隔),而every
则允许您指定特定行。
every
之后的冒号分隔数字的格式应为1:1:<line_number>:<block_number>:<line_number>:<block_number>
,其中行号是该块的行(从0开始),块号是块(由单个回车分隔,再次从0开始)。第一个和第二个数字表示每1行和每个数据块的绘图,第三个和第四个数字表示从行<line_number>
和块<block_number>
开始。第五和第六说什么停止。这允许您在数据文件中的任何位置选择一行。
plot命令的最后一部分将特定列(在本例中为第1列)中的值分配给变量(var
)。绘图命令需要有两个值,因此我选择第1列来绘制我的变量赋值语句。
答案 2 :(得分:2)
这是一个较少'awk'的解决方案,它将文件'Data.txt'的第一行和第六列的值分配给变量x16。
set table
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex)
# RowIndex starts with 0, ColumnIndex starts with 1
# 'u' is an abbreviation for the 'using' modifier
plot 'Data.txt' u 0:($0==0?(x16=$6):$6)
unset table
下面给出了存储多个值的更一般的例子:
# Load data from file to variable
# Gnuplot can only access the data via the "plot" command
set table
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex)
# RowIndex starts with 0, ColumnIndex starts with 1
# 'u' is an abbreviation for the 'using' modifier
# Example: Assign all values according to: xij = Data33[i,j]; i,j = 1,2,3
plot 'Data33.txt' u 0:($0==0?(x11=$1):$1),\
'' u 0:($0==0?(x12=$2):$2),\
'' u 0:($0==0?(x13=$3):$3),\
'' u 0:($0==1?(x21=$1):$1),\
'' u 0:($0==1?(x22=$2):$2),\
'' u 0:($0==1?(x23=$3):$3),\
'' u 0:($0==2?(x31=$1):$1),\
'' u 0:($0==2?(x32=$2):$2),\
'' u 0:($0==2?(x33=$3):$3)
unset table
print x11, x12, x13 # Data from first row
print x21, x22, x23 # Data from second row
print x31, x32, x33 # Data from third row