3

関数プロットのいくつかのカプレットでプロットステートメントをループさせようとしています。正しい順序でオーバードローが作成されるため、ステートメントの順序は重要です。

#!/usr/bin/gnuplot -persist

datfile="overdraw.dat"
num=3
skip=40

set table datfile
g(x,t)=exp(-x**2+{0,1}*2*t*x)
set samples 501
plot [-2:2][0:5] for [ii=0:num] real(g(x,ii))
unset table

xspeed=0.1
yspeed=0.3

## this works but creates overdraw in the wrong order
#plot [-2:2] \
#  for [ii=0:num] datfile index ii u ($1+xspeed*ii):($2-yspeed*ii) not w l lt ii lw 8 \
#, for [ii=0:num] datfile index ii every skip u ($1+xspeed*ii):($2-yspeed*ii) not w p lt ii pt 7 ps 4 \
#

set macro

## this works but is cumbersome
plotstring="NaN not"
do for [ii=0:num] {
  plotstring=plotstring.sprintf(", \"%s\" index %i u ($1+xspeed*%i):($2-yspeed*%i) not w l lt %i lw 8", datfile, ii, ii, ii, ii)
  plotstring=plotstring.sprintf(", \"%s\" index %i every skip u ($1+xspeed*%i):($2-yspeed*%i) not w p lt %i pt 7 ps 4", datfile, ii, ii, ii, ii)
}
plot [-2:2] @plotstring


## this doesn't work because the for loop only applies to the first statement
#plotboth='datfile index ii u ($1+xspeed*ii):($2-yspeed*ii) not w l lt ii lw 8\
#, datfile index ii every skip u ($1+xspeed*ii):($2-yspeed*ii) not w p lt ii pt 7 ps 4'
#plot [-2:2] for [ii=0:num] @plotboth


## this gives an error message
plot [-2:2] for [ii=0:num] { \
  datfile index ii u ($1+xspeed*ii):($2-yspeed*ii) not w l lt ii lw 8\
, datfile index ii every skip u ($1+xspeed*ii):($2-yspeed*ii) not w p lt ii pt 7 ps 4 \
}

ご覧のとおり、プロット ステートメントを保持する文字列に追加することで、正しい順序で機能するようにしました。ただし、私の例の最後に示されているように、プロット ステートメントを単に括弧で囲むことができると便利です。

複数の plot/replot ステートメントを送信することは、オプションではないようです。これは、一部の端末 (postscript など) でページを作成するためです。multiplot も面倒だと思います。おそらく、私が見落としていたエレガントな構文がありますか?

4

1 に答える 1

2

ライン用とポイント用の 2 つのコマンドを使用する代わりに、ポイントを含むラインに対して 1 つのコマンドを使用することをお勧めしますが、多くのデータポイントがあるため、プロット内のいくつかをスキップします (skip変数で意図したとおり)。 )。
データセットに基づいて、次のコードを使用してプロットを生成しました。

plot [-2:2] for [ii=0:num] datfile index ii u ($1+xspeed*ii):($2-yspeed*ii) \
  not w lp lt ii lw 8 pt 7 pi skip ps 4  

w lpコマンド ( の略) を使用with linespointsして線点を表示し、pi skip( の略) を使用してシンボル間のデータポイントpointinterval skipをスキップしました。との40詳細については、ドキュメントを参照してください。linespointspointinterval

于 2013-06-12T20:13:48.857 に答える