3

gnuplot スクリプトで奇妙な動作に遭遇しました。このスクリプトの目的は、ファイルを読み取り、ファイルの最初の行をシリーズ ヘッダーとして使用して、特定の行セット (ファイル内の特定の開始点に基づく 3 つの連続する行) をプロットすることです。

プロットは概念的には機能しますが、空の行が読み取られて 0 (ヘッダーなし) としてプロットされているかのように、左側の画像に大きな挿入が発生しています。

入力ファイル:

Level,Filter,Type,Set1,Set2,Set3
Level1,Filter1,Type1,112,186,90
Level1,Filter1,Type2,233,335,159
Level1,Filter1,Type3,224,332,157

コード:

set terminal postscript color
set output '| epstopdf --filter --outfile=output.pdf'

set boxwidth 0.5
set style fill solid
set style data histograms

set datafile separator "," 

LINE1 = 1 + 3 * COUNT
LINE2 = LINE1 + 1
LINE3 = LINE1 + 2

plot '../test.csv' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $4 : 1/0) ti col,'' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $5 : 1/0) ti col,'' \
u ( ( int($0) == LINE1 || int($0) == LINE2 || int($0) == LINE3)? $6 : 1/0) ti col

コマンド ライン呼び出し

>gnuplot -e "COUNT=0" test.plot

右シフトにつながる空のフィールドを取り除くにはどうすればよいですか?

私のgnuplotのバージョンは4.6です。

4

1 に答える 1

2

すでにパイプと UNIX 風のツールを使用しているので、sedここでも使用します。

set term post color
set output 'foo.ps'

set style data histograms 
set style histogram clustered 

set datafile separator ","     

set boxwidth 0.5
set style fill solid

SED_CMD = sprintf('< sed -n -e 1p -e %d,%dp test.csv',COUNT*3+2,COUNT*3+4)

plot for [COL=4:6] SED_CMD u COL ti col

あなたのスクリプトが何をしているのかを理解しようとしている間、私は多くのことを単純化しました - 私はプロット反復を使用しました (gnuplot 4.3 で導入されました)。もともと私はそれがうまくいくと思っていましたplot '...' every ...が、ヒストグラムが詰まるようで、every(まだ!)理由がわかりません。

sedコマンドの説明は次のとおりです。

-e 1p      #print first line in file
-e %d,%dp  #print n'th line through m'th line (inclusive) where n=COUNT*3+2 and m=COUNT*3+4

シェル インジェクションが心配な場合は、これも安全なようです。

gnuplot -e 'COUNT=";echo hi"' -persist test.gp
"test.gp", line 10: Non-numeric string found where a numeric expression was expected

gnuplot は、コマンド文字列に数値のみを書き込みます。

于 2012-11-08T19:27:31.950 に答える