2

明確にするために:

次のようなデータがあります。

0,  , ,1,2
1,  , ,2,3
2, 1, ,4,5
3, 1, ,4,6
4, 1,1,4,7
5, 1,2,5,8
6, 1,4,6,7

値が欠落している複数の列 (ファイルの先頭のみ)。今、列2、3、および5をプロットしたいのですが、プロットしたいすべてのセットにデータがある時点からプロットを開始する必要があります。

したがって、xrange が [0:10] の場合、2,3,5 をプロットする場合、4:6 からのみプロットする必要があります。2,4,5 をプロットすると、2:6 からプロットする必要があります。値が存在するかどうかをテストする可能性はありますか?

私はすでに次のようなことを試しました

plot \
"file.txt" using 1:($2 + ($3*0) + ($5*0)) with lines, \
"file.txt" using 1:($3 + ($2*0) + ($5*0)) with lines, \
"file.txt" using 1:($5 + ($3*0) + ($2*0)) with lines, \

使用する1つの要素のデータが存在しない場合、gnuplotは行全体を無視することを望んでいたためです。

誰かアイデア?

4

2 に答える 2

1

ああ - 私は自分の出力を誤解しました。

上記で投稿した最小限の例ですべてをテストすると、私の解決策はうまくいくようです。

私は今、物事を少し良くするために、いくつかのチェック関数のダミーを作成しました。

check2(x1, x2) = 0
check3(x1, x2, x3) = 0
check4(x1, x2, x3, x4) = 0
check5(x1, x2, x3, x4, x5) = 0
check6(x1, x2, x3, x4, x5, x6) = 0
check7(x1, x2, x3, x4, x5, x6, x7) = 0
check8(x1, x2, x3, x4, x5, x6, x7, x8) = 0

plot \
"file.txt" using 1:($2 + check3($2, $3, $5)) with lines, \
"file.txt" using 1:($3 + check3($2, $3, $5)) with lines, \
"file.txt" using 1:($5 + check3($2, $3, $5)) with lines, \

ただし、誰かがより良い方法を知っている場合は、知識を共有してください。

ありがとうございました

編集:

クリストフが他の回答で提案したマクロと組み合わせると、全体がよりコンパクトになります。

set macro
check3(x1, x2, x3) = 0
AllOrNothing = "check3($2, $3, $5)"
plot \
"file.txt" using 1:($2 + @AllOrNothing ) with lines, \
"file.txt" using 1:($3 + @AllOrNothing ) with lines, \
"file.txt" using 1:($5 + @AllOrNothing ) with lines
于 2013-09-03T13:20:18.463 に答える
1

基本的に、valid関数を使用して、列に有効なデータが含まれているかどうかを確認できます。これは1、データが有効な場合に返され、0そうでない場合に返されます。したがって、可能なplotコマンドは次のようになります。

plot 'file.txt' using 1:(valid(2)+valid(4)+valid(5) == 3 ? $2 : 1/0),\
...

以下は、使用する列が string で定義されているバリアントcolsです。validチェックは動的に構築され、using ステートメントの後半でマクロとして呼び出されます。

set datafile separator ','
set style data lines
set macros

cols = "2 4 5"
col_cnt = words(cols)
col_valid = ""
do for [i in cols] {
    col_valid = col_valid . sprintf("valid(%s)+", i)
}
col_valid = col_valid . '0 != col_cnt ? 1/0'

set offsets 0,0,1,1
plot 'file.txt' using 1:(@col_valid : $2) t 'col 2',\
     '' using 1:(@col_valid : $4) t 'col 4',\
     '' using 1:(@col_valid : $5) t 'col 5'

もちろん、値のループを含めることもできcolsます。私はその部分をスキップしたので、ある程度の読みやすさを維持して;)ください。

編集: @vlad_tepesch のコメントに従ってスクリプトを改善しました。

于 2013-09-03T13:25:41.557 に答える