13

なぜ私がこのgnuplotのコードを作るとうまくいくのですか:

set terminal postscript enhanced color
set output '../figs/ins_local.ps'

set title "Result"

set logscale y
set xrange [50:100]
set xtics 5

#set xlabel "Insertion"
#set ylabel "Time (in microseconds) "

plot sin(x)

しかし、私が変更plot sin(x)すると:

plot "../myFile.final" with lines title "Somethings" lw 3  linecolor rgb "#29CC6A"

私はこのエラーがあります:

plot "../myFile.final" with lines title "Somethings" lw 3  linecolor rgb "#29CC6A"
                                                                                              ^
"local.gnuplot", line 16: all points y value undefined

私はちょうど1つの列を持っています! それは表すyrangexrange行数で表します!私のデータポイントの例:

125456
130000
150000

x の最初の点は 1、x の 2 番目の点は 2、最後は 3 です。今度は、この 1、2、3 をスケール 50、55、60 で表現したいと思います。

4

1 に答える 1

25

ここで問題が発生する可能性がいくつかあります。データファイルを見ないと判断できません。私が頭のてっぺんから思いつくことができるカップルは次のとおりです。

列 2 のすべてのデータポイントはすべて 0 以下です (log(0) が定義されていないため、エラー メッセージが表示されます)。

50 から 100 の間の最初の列にポイントがありません。この場合、すべてのデータポイントがプロット範囲から切り取られます。set xrange [50:100]

データファイルには 1 列しかありません...この場合、gnuplot は y 値を認識しません。( に変更plot '../myFile.final' u 1 ...)

編集

さて、あなたのデータファイルを見たので、問題は間違いなくあなたが持っていることですがset xrange [50:60]、あなたのデータの xrange は 0 から 2 までしか実行されません (gnuplot はデータファイルのインデックスを 0 から開始します)。これを修正する最も簡単な方法は、疑似列 0 を使用することです。疑似列 0 は、単に 0 から始まる行番号です (これは、gnuplot が x 軸にプロットするものですplot 'blah.txt' using 1。例を次に示します。

scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x
plot 'test.dat' using (scale_x($0,50,60,0,2)):1 w lines title "scaled xrange"

using 仕様がどのように機能するかがわからない場合は、$ で始まる数字は、その列全体に対する要素単位の操作であることに注意してください。例えば:

plot 'foo.bar' using 1:($2+$3) 

データファイルの各行の最初の列と 2 番目と 3 番目の要素の合計をプロットします。

このソリューションは、データファイル内の x の最大値を知っていることを前提としています (この場合、それは 3-1=2 -- [3 点、0,1,2]) です。データポイントの数がわからない場合は、シェル マジックを使用するか、gnuplot から直接取得できます。最初の方法は少し簡単ですが、移植性は高くありません。両方を示します。

XMAX=`wc -l datafile | awk '{print $1-1}'` 
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x
plot 'test.dat' using (scale_x($0,50,60,0,XMAX)):1 w lines title "scaled xrange"

2 番目の方法では、データを 2 回通過させて、gnuplot に最大値を取得させる必要があります。

set term push  #save terminal settings
set term unknown #use unknown terminal -- doesn't actually make a plot, only collects stats
plot 'test.dat' u 0:1 #collect stats
set term pop   #restore terminal settings
XMIN=GPVAL_X_MIN #should be 0, set during our first plot command
XMAX=GPVAL_X_MAX #should be number of lines-1, collected during first plot command
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange"

完全を期すために、これはgnuplot 4.6でも簡単に実行できると言わなければなりません(現在インストールしていないので、この次の部分はドキュメントの理解から来ています):

stats 'test.dat' using 0:1 name "test_stats"
#at this point, your xmin/xmax are stored in the variables "test_stats_x_min"/max
XMIN=test_stats_x_min
XMAX=test_stats_x_max
scale_x(x,xmin,xmax,datamin,datamax)=xmin+(xmax-xmin)/(datamax-datamin)*x
plot 'test.dat' using (scale_x($0,50,60,XMIN,XMAX)):1 w lines title "scaled xrange"

Gnuplot 4.6 はかなりクールに見えます。私はおそらくすぐにそれをいじり始めるでしょう。

于 2012-05-30T12:08:29.843 に答える