13

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: No such file or directory "testPlot.gnu", line 9: Non-numeric string found where a numeric expression is expected

4

3 回答 3

15

你有几个选择...

第一个选项

采用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}'")

哇,好多了。

于 2012-06-26T18:05:32.930 回答
5

这是一个非常古老的问题,但这是访问数据文件中任何位置的单个值并将其保存为 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<line_number>和 block开始<block_number>。第五和第六说在哪里停下来。这允许您在数据文件的任何位置选择一行。

plot 命令的最后一部分将特定列(在本例中为第 1 列)中的值分配给您的变量 ( var)。绘图命令需要有两个值,因此我选择了第 1 列来针对我的变量赋值语句进行绘图。

于 2013-04-08T20:56:54.937 回答
3

这是一个较少'awk'-ward的解决方案,它将文件'Data.txt'的第一行和第6列的值分配给变量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
于 2015-03-12T10:51:49.290 回答