优雅的方式来循环gnuplot 4.6中的几个语句?

时间:2013-05-10 01:12:41

标签: loops nested gnuplot

我试图在几个函数图上有一个情节语句循环。语句的顺序很重要,因为它会以正确的顺序创建透支。

#!/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)。我认为多重时乐也很麻烦。也许我忽略了一种优雅的语法?

1 个答案:

答案 0 :(得分:2)

我没有两个命令,一个用于线,一个用于点,我建议用一个带有点的线的命令,但是 - 因为有很多数据点 - 在图中跳过一些(如你想要的那样)使用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 skippointinterval skip的缩写{1}})跳过符号之间的40数据点。有关linespointspointinterval的更多信息,请参阅documentation