对于gnuplot中的循环崩溃

时间:2017-08-19 15:04:47

标签: for-loop gnuplot

我在重排列的gnuplot脚本上遇到了不稳定的行为。

脚本打算绘制边线。使用填充曲线和线条样式。此外,通过

显示单参数曲线族
plot for [i=1:4] f(x,i) title sprintf("f(x,i) i=%d",i) w l  dt 2

我在这里发了一个例子https://pbs.twimg.com/media/DHbeEgXXkAAV6aS.jpg:large

在这个阴谋之后,我继续介绍阿根廷。在新的代码行之后,蓝色的虚线开始表现不正常。其中两个消失了。

我开始调试代码并最终使用 set table 实用程序将整个绘图输出到单个文件中。

我发现for循环表现不稳定。标题行显示循环变量i从开始到结束值正确运行。但是函数f(x,i)没有正确地输入正确的i值。

在第一次迭代时,循环的工作正常,脚本绘制为f(x,1)。在第二次迭代中,函数被正确馈送并显示f(x,2)。但是此后函数总是以i = 2进行,尽管标题字符串正确显示了i

的变化

结果图是

For-loop plot crashing. There should be four lines

我真的很感激帮助我找到错误的提示。

我现在将添加几行代码。情节命令

plot for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w filledcurve lc rgb colorFondoCET,\
       for [i=1:words(paises_wet)] countries u ($1+15+dst*word(dst_wet,i)*15):(mercator($2)) index (word(paises_wet,i)+0) w filledcurve lc rgb colorFondoWET,\
       for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w filledcurve lc rgb colorFondoGET,\
       "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\
   "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\
 for [k=1:5:1] mercator(orto(x,real(b1)+real(k)*real(15.0))) tit  sprintf("orto a %02d signo %d",k,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+1*15)) tit  sprintf("no loop orto a %02d signo %d",1,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+2*15)) tit  sprintf("no loop orto a %02d signo %d",2,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+3*15)) tit  sprintf("no loop orto a %02d signo %d",3,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+4*15)) tit  sprintf("no loop orto a %02d signo %d",4,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+5*15)) tit  sprintf("no loop orto a %02d signo %d",5,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+0*15)) tit  sprintf("no loop orto a %02d signo %d",0,Signo) w l lc rgb 'blue' dt 2 lw 3,\

for-loop(第6行)不起作用。逐行调用(第7-12行)可以正常工作。

set table获得的输出,每次迭代的第一行

# Curve 43 of 104, 100 points FIRST iteration
# Curve title: "orto a 01 signo 1"
# x y type
-22.5 0.874361°  i
-21.9697 0.887919°  i
-21.4394 0.901287°  i
-20.9091 0.914467°  i

# Curve 44 of 104, 100 points SECOND iter
# Curve title: "orto a 02 signo 1"
# x y type
-22.5 0.407722°  i 
-21.9697 0.426936°  i
-21.4394 0.445968°  i 
-20.9091 0.464814°  i

# Curve 45 of 104, 100 points THIRD iter (REPEATS 2nd)
# Curve title: "orto a 03 signo 1" 
# x y type
-22.5 0.407722°  i
-21.9697 0.426936°  i
-21.4394 0.445968°  i
-20.9091 0.464814°  i

# Curve 46 of 104, 100 points FOURTH iter (repeats 2nd)
# Curve title: "orto a 04 signo 1"
# x y type
-22.5 0.407722°  i
-21.9697 0.426936°  i
-21.4394 0.445968°  i
-20.9091 0.464814°  i

# Curve 47 of 104, 100 points FIFTH iter (repeats 2nd)
# Curve title: "orto a 05 signo 1"
# x y type
-22.5 0.407722°  i
-21.9697 0.426936°  i
-21.4394 0.445968°  i
-20.9091 0.464814°  i

1 个答案:

答案 0 :(得分:0)

现在我已经解决了这个问题。

我再次粘贴情节(多)线。绘图线在左侧(日出)子图中运行两次,第二次在multiplot环境中运行右侧(日落)子图。它们在函数orto的定义和b1的值中有所不同。

plot "usa.dat" u (usaBool?($1+6*15):1/0):(mercator($2)) w filledcurve lc rgb colorFondoFET,\
 for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w filledcurve lc rgb colorFondoCET,\
       for [i=1:words(paises_wet)] countries u ($1+15+dst*word(dst_wet,i)*15):(mercator($2)) index (word(paises_wet,i)+0) w filledcurve lc rgb colorFondoWET,\
       for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w filledcurve lc rgb colorFondoGET,\
       "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\
   "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\
 mercator(orto(x,b1+1*15)) tit  sprintf("no loop orto a %02d signo %d",1,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+2*15)) tit  sprintf("no loop orto a %02d signo %d",2,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+3*15)) tit  sprintf("no loop orto a %02d signo %d",3,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+4*15)) tit  sprintf("no loop orto a %02d signo %d",4,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+5*15)) tit  sprintf("no loop orto a %02d signo %d",5,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 mercator(orto(x,b1+0*15)) tit  sprintf("no loop orto a %02d signo %d",0,Signo) w l lc rgb 'blue' dt 2 lw 3,\
 for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w l lt 1 lc rgb colorLinea,\
       for [i=1:words(paises_wet)] countries u ($1+15*(1+dst*word(dst_wet,i))):(mercator($2)) index (word(paises_wet,i)+0) w l lt 1 lc rgb colorLinea,\
       for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w l lt 1 lc rgb colorLinea,\
       "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w l lt 1 lc rgb colorLinea,\
   "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w l lt 1 lc rgb colorLinea,\
   "usa.dat" u (usaBool?($1+6*15):1/0):(mercator($2)) w l lt 1 lc rgb 'gray50',\
   for [i=0:2] "ciudadesChile.dat" u ($2-($6-1+((new==0&i==2)?-1:((new==2&i==1)?1:0))-dst*word(dstSouthAm,i+1))*15):(mercator(abs($1))) index i w p pt 7 lc 1 ps 1.5,\
   "ciudadesUsa.dat" u (usaBool?($2+6*15):1/0):(mercator(abs($1))) w p pt 7 lc rgb 'blue' ps 1.5,\
 for [k=1:5:1] mercator(orto(x,real(b1)+real(k)*real(15.0))) tit  sprintf("orto a %02d signo %d",k,Signo) w l lc rgb 'green' dt 2 lw 10,\
 for [i=0:2] "ciudadesChile.dat" u ($2-($6-1+((new==0&i==2)?-1:((new==2&i==1)?1:0))-dst*real(word(dstSouthAm,i+1)+0))*15-$4*.5):(mercator(abs($1+$5*1.1))):(stringcolumn($3)) index i w labels font "Arial-Bold,10" tc rgb word(corporativa,1),\
   "ciudadesUsa.dat" u (usaBool?($2+6*15-$4*.5):1/0):(mercator(abs($1+$5*1.1))):3 w labels font "Arial-Bold,10" tc rgb 'blue',\
 for [i=1:words(Coastlines)] coastline u 1:(mercator($2)) index (word(Coastlines,i)+0) w  l lt 1 lc rgb 'gray50',\

问题在于底部的第3行,以for [i=0:2]开头。

如果删除此行;循环for [k=1:5:1]运行正常。

如果for [k=1:5:1]位于第3行之后,则脚本运行正常。

如果for [k=1:5:1]位于距离底部第3行之前,则循环无法正常运行。

Image produced in failure mode Image OK

for [i=0:2]打印智利和阿根廷城市的名称。列$1是纬度,$2是经度。他们从$4$5的中心位置移位。变量iindex控制着国家:Argentina=0 Chile=1 RegionMagallanes (Chile)=2。变量new控制智利的时区new=0在2015年之前; new=1是当前状态,new=2是指2015年。列$6是指参考时区(-3阿根廷和Magallanes,-4智利)。

该脚本还控制冬季(dst=0)或夏季(dst=1)条件。

我已经尝试逐一删除for [i=0:2]行的片段(单项式)。没有成功。即使我编辑了ciudadesChile.dat文件,也更改了将$1$2分隔为空格的标签。没有成功。