wha*_*ace 11 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)
Run Code Online (Sandbox Code Playgroud)
以下是我的数据文件的前几行:
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
Run Code Online (Sandbox Code Playgroud)
我不知道如何正确读取数据,或者这是否是正确的解决方法.
编辑#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)
Run Code Online (Sandbox Code Playgroud)
但我收到错误:找到数字表达式的非数字字符串
编辑#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)
Run Code Online (Sandbox Code Playgroud)
这给出了错误 - > head:file:没有这样的文件或目录"testPlot.gnu",第9行:找到数字表达式的非数字字符串
mgi*_*son 14
你有几个选择......
第一选择:
使用 columnheader
plot file using 1:3 title columnheader(6)
Run Code Online (Sandbox Code Playgroud)
我没有测试过,但这可能会阻止第一行实际绘制.
第二种选择:
使用外部实用程序获取标题:
TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE
Run Code Online (Sandbox Code Playgroud)
如果变量是数字,并且您想重新格式化它,则在gnuplot中,您可以通过向它们添加0(例如)将字符串转换为数字类型(整数/浮点数).
print "36.5"+0
Run Code Online (Sandbox Code Playgroud)
然后你可以用它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)
Run Code Online (Sandbox Code Playgroud)
编辑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
Run Code Online (Sandbox Code Playgroud)
为了解决你的问题2,熟悉shell实用程序是个好主意 - sed和awk都可以做到.我将展示头/尾的组合:
cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'
Run Code Online (Sandbox Code Playgroud)
应该管用.
编辑3
我最近了解到,在gnuplot中,它既system是一个函数,也是一个命令.要做到以上没有所有的辩论体操,
data=system("head -1 " . file . " | awk '{print $6}'")
Run Code Online (Sandbox Code Playgroud)
哇,好多了.
这是一个非常老的问题,但是这是一种获取数据文件中任何位置的单个值并将其另存为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
Run Code Online (Sandbox Code Playgroud)
该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)。plot命令需要有两个值,因此我选择了第1列以针对变量赋值语句进行绘制。