For loop Gnuplot:replot内的do for

For loop Gnuplot:replot内的do for,for-loop,gnuplot,For Loop,Gnuplot,在3个版本的replotting中,只有2个版本可以根据需要工作: plot sin(x) replot sin(x)/2 replot sin(x)/3 replot sin(x)/4 每个命令后,相应的曲线将添加到绘图中-如预期的那样 plot sin(x) replot for [i=2:4] sin(x)/i 给出相同的(最终)结果(图中有4条曲线),但 结果在一个只有第1条和第4条曲线的绘图中,尽管键中有4条线。这是一个“特性”还是(如何)在do for版本中获得4条曲线(因为我必

在3个版本的replotting中,只有2个版本可以根据需要工作:

plot sin(x)
replot sin(x)/2
replot sin(x)/3
replot sin(x)/4
每个命令后,相应的曲线将添加到绘图中-如预期的那样

plot sin(x)
replot for [i=2:4] sin(x)/i
给出相同的(最终)结果(图中有4条曲线),但

结果在一个只有第1条和第4条曲线的绘图中,尽管键中有4条线。这是一个“特性”还是(如何)在do for版本中获得4条曲线(因为我必须在do子句中做一些额外的工作)


[gnuplot 5.2(8),ubuntumate 20.04]

因此在do for循环中使用
replot
的一种方法是创建一个宏:

plot sin(x), cos(x)
txt = ""
do for [i=2:4] {
  # some calculations involving i
  txt = txt . "replot sin(x)/" . i . ", cos(x)/" . i . " ; "
  # maybe some more stuff involving i
}
@txt

因此,在do for循环中使用
replot
的一种方法是创建一个宏:

plot sin(x), cos(x)
txt = ""
do for [i=2:4] {
  # some calculations involving i
  txt = txt . "replot sin(x)/" . i . ", cos(x)/" . i . " ; "
  # maybe some more stuff involving i
}
@txt
附加方式 还有一种方法可以在循环中使用
eval
命令,如下所示

plot sin(x), cos(x)
do for [i=2:4] {
  # some calculations involving i
  command = sprintf("replot sin(x)/%i, cos(x)/%i", i, i)
  eval command
  # maybe some more stuff involving i
}
附加方式 还有一种方法可以在循环中使用
eval
命令,如下所示

plot sin(x), cos(x)
do for [i=2:4] {
  # some calculations involving i
  command = sprintf("replot sin(x)/%i, cos(x)/%i", i, i)
  eval command
  # maybe some more stuff involving i
}

我认为表达您最初尝试的语法是:

do for [i=1:4] {
    # ... do some stuff ...  #
    plot for [j=1:i] sin(x)/j title sprintf("sin(x)/%d",j)
}

replot
并不是你想要的那样。

我认为表达你最初尝试的语法是:

do for [i=1:4] {
    # ... do some stuff ...  #
    plot for [j=1:i] sin(x)/j title sprintf("sin(x)/%d",j)
}

replot
真的不是你想要的这类东西。

你可以这样绘制所有4条曲线
绘制[i=1:4]sin(x)/i
。你还需要做什么?为什么你需要一个
do for
循环?除了一些其他东西(使用“i”计算),我想-说得非常简单-也画cos(x)/i。使用“replot for[i=2:4]sin(x)/i;replot for[i=2:4]cos(x)/i”会产生错误的顺序,因为我想要sin(x)、cos(x)、sin(x)/2、cos(x/2……,实际上在上一个示例中,
sin(x)的3条曲线/4
将位于彼此的顶部。如果您在gnuplot控制台中键入
show plot
,您将得到
最后一个plot命令是:plot sin(x)、sin(x)/i、sin(x)/i、sin(x)/i
以及最后一个
replot
命令
i=4
。我想这就是
replot
的工作方式。它不会绘制
sin(x)、sin(x)/2、sin(x)/3,sin(x)/4
。如果顺序很重要,例如,以你的交替sin(x),cos(x)为例,你可以使用:
为[b=0:1]b的[i=1:4]绘制sin(x)/i:cos(x)/i title sprintf(“%s(x)/%d”,b'sin':'cos',i)
。但也许你可以编辑这个问题并更详细地描述你的最终目标。“我想这就是replot的工作方式。”-看起来是这样,是的。因此我找到了一个解决方案(我将在几秒钟后发布)创建一个宏。(虽然这在我的实际问题中并不像在这里的简单示例中看起来那么好。)您可以像这样绘制[I=1:4]sin(x)的所有4条曲线/我。为什么你需要一个
do for
循环?除了一些其他东西(使用“i”进行计算),我想——说得非常简单——也画cos(x)/i。使用“replot for[i=2:4]sin(x)/i;replot for[i=2:4]cos(x)/i”会产生错误的顺序,因为我想要sin(x),cos(x),sin(x)/2,cos(x/2,…实际上在上一个示例中,
sin(x)/4
的3条曲线将相互重叠。如果在gnuplot控制台中键入
show plot
,您将得到
最后一个plot命令是:plot sin(x),sin(x)/i,sin(x)/i,sin(x)/i,sin(x)/对于最后一个
replot
命令
i=4
。我想这就是
replot
的工作方式。它不会绘制
sin(x),sin(x)/2,sin(x)/3,sin(x)/4
。如果顺序很重要,例如,对于交替的sin(x),cos(x)示例,您可以使用:
为[i=1:4]绘制[b=0:1]b?sin(x)/i:cos(x)/我把sprintf命名为(“%s(x)/%d”,b?'sin':'cos',i)
。但是也许你可以编辑这个问题并更详细地描述你的最终目标。“我想这就是replot的工作方式。”-看起来是这样,是的。因此我找到了一个解决方案(我将在几秒钟后发布)来创建一个宏。(虽然这在我的实际问题中并不像在这个简单的例子中看起来那么好。)好的,好的…但是“你需要在do for循环中做的其他事情”在哪里?使用我在上面的评论中发布的代码,你会得到同样的结果…我编辑了我的答案并添加了“其他东西”。好的,好的…但是问题在哪里“在do for循环中需要做的其他事情”?使用我在上面的评论中发布的代码,您会得到相同的结果…我编辑了我的答案并添加了“其他事情”“这是一种可行的方法,可以将正确的数字输入到
i
。哈,我记得我关于StackOveflow的第一个问题可能是关于在Python中使用
eval
,我得到了5张反对票,因为他们说“永远不要使用
eval()
.Eval是邪恶的。好吧,…这是一个可行的方法,可以让正确的数字进入
i
。哈,我记得我关于StackOveflow的第一个问题可能是关于在Python中使用
Eval
,我得到了5张反对票,因为他们说“永远不要使用
Eval()
。Eval是邪恶的。好吧。。。