gnuplot将一个数字从数据文件存储到变量中

时间:2012-06-26 15:59:09

标签: variables gnuplot

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行:找到预期数值表达式的非数字字符串

3 个答案:

答案 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

然后,您可以使用sprintfgprintf对其进行格式化。

没有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