13

OSXv10.6.8およびGnuplotv4.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行目:数値式が予期された場所に非数値文字列が見つかりました

4

3 に答える 3

15

いくつかのオプションがあります...

最初のオプション:

使用するcolumnheader

plot file using 1:3 title columnheader(6)

私はそれをテストしていませんが、これにより最初の行が実際にプロットされない可能性があります。

2番目のオプション:

外部ユーティリティを使用してタイトルを取得します。

TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE

変数が数値で、それを再フォーマットしたい場合は、gnuplot で、文字列に 0 を追加することで数値型 (integer/float) にキャストできます (例)。

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)

EDIT 2(以下のコメントに対処)

バックティックで変数を展開するには、マクロが必要です。

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 に対処するには、シェル ユーティリティに慣れておくことをお勧めします。sed と awk の両方で実行できます。頭と尾の組み合わせを示します。

cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'

動作するはずです。

編集3

system最近、gnuplot ではがコマンドであると同時に関数であることを知りました。すべてのバックティック体操なしで上記を行うには、

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番号により、特定のデータセット (2 つのキャリッジ リターンで区切られている) をアドレスevery指定でき、特定の行を指定できます。

後ろのコロンで区切られた数字everyは の形式1:1:<line_number>:<block_number>:<line_number>:<block_number>である必要があります。ここで、行番号はブロックのある行 (0 から始まる) であり、ブロック番号はブロックの番号です (単一のキャリッジ リターンで区切られ、再び から始まります)。 0)。最初と 2 番目の数字は、1 行ごと、1 データ ブロックごとにプロットすることを示し、3 番目と 4 番目は、行<line_number>とブロックから開始することを示します<block_number>。5 番目と 6 番目は、停止する場所を示します。これにより、データ ファイル内の任意の場所で 1 行を選択できます。

plot コマンドの最後の部分は、特定の列 (この場合は列 1) の値を変数 ( var) に割り当てます。プロット コマンドには 2 つの値が必要なので、変数割り当てステートメントに対してプロットする列 1 を選択しました。

于 2013-04-08T20:56:54.937 に答える
3

これは、ファイル「Data.txt」の最初の行と6番目の列の値を変数x16に割り当てる、「awk」ワードの少ないソリューションです。

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 に答える