【问题标题】:How to show plots inside a loop in mathematica如何在mathematica中显示循环内的图
【发布时间】:2011-04-06 22:01:51
【问题描述】:

我想知道您是否有在 mma 中显示循环内图的好方法。通常Plot函数的输出是不显示的,例如下面的代码:

For[i = 1, i <= 10, i++, Plot[Sin[i*x], {x, -Pi, Pi}]]

感谢您的帮助。

编辑

关于我的previous question,我已经有了 For 循环,例如,像这样的For[i = 1, i <= 10, i++, Plot[Sin[i*x], {x, -Pi, Pi}]]。鉴于这一事实,我想在 For 循环中添加类似“按任意键继续...”的内容,然后在每次按任意随机键时刷新绘图。谁能给出完整的工作代码?

【问题讨论】:

  • 是否必须是按键,并且只能前进?总是有Manipulate
  • @Jefromi:是的,理想情况下我想要按键。

标签: wolfram-mathematica


【解决方案1】:

只需使用Print:

For[i = 1, i <= 10, i++, Plot[Sin[i*x], {x, -Pi, Pi}] // Print]

Monitor

Monitor[For[i = 1, i <= 10, i++, p = Plot[Sin[i*x], {x, -Pi, Pi}]; 
  Pause[0.5]], p]

(这里使用暂停来给一些时间来查看情节;这里的循环非常快。如果需要,请删除)

编辑
根据要求,由鼠标控制的版本点击图表(按键需要图表获得焦点,因此您仍需要点击)

Monitor[For[i = 1, i <= 10, , p = Plot[Sin[i*x], {x, -Pi, Pi}]], 
EventHandler[p, {"MouseDown" :> i++}]]

这是一种非常愚蠢的方法。循环不断地重绘绘图。所以,一个稍微(但仍然丑陋)的版本可能是:

s = True;
Monitor[
 For[i = 1, i <= 10, ,
  If[s,
   (* Put main loop body here*) 
   p = Plot[Sin[i*x], {x, -Pi, Pi}] 
   (* end of main body *) ;
   s = False (* prevents continuous re-evaluating main body *)
   ]
  ]
 , EventHandler[p, {"MouseDown" :> (i++; s = True)}]
 ]

【讨论】:

  • @Sjoerd C. de Vries:谢谢。这确实情节,但它产生了很多情节。理想情况下,我希望在按任意键后刷新绘图。你知道如何实现这个效果吗?
  • @Qiang 你在我给出这个答案后改变了你的问题。你还想在 For 循环中使用它吗?与此同时,迈克尔已经提供了一个没有它的答案。
  • @Sjoerd C. de Vries:是的,我仍然希望它在 For 循环中。
  • @Sjoerd:通过键盘事件来实现这一点很棘手,因为笔记本的焦点偏离了情节。尝试将它与 NotebookMove[] 结合会遇到不实际显示 Plot 的问题。我可以解决它的唯一方法是使用显式(单元格)打印和单元格删除命令......
  • @Simon 你也可以使用PrintTemporary,它的作用类似于Print,但返回一个NotebookInterfaceObject,你可以在同一个评估中传递给NotebookDelete,删除单元格。避免使用SelectionMove
【解决方案2】:

只返回一个绘图列表,而不是使用For 循环:

Table[Plot[Sin[i*x], {x, -Pi, Pi}], {i, 1, 10}]

如果您希望将它们全部连接为一个情节,Show[listOfPlots] 是一种方法:

Show[Table[Plot[Sin[i*x], {x, -Pi, Pi}], {i, 1, 10}]]

更新

这是使用DynamicEventHandler 的一种简单方法:

DynamicModule[{i = 1},
 EventHandler[Dynamic[Plot[Sin[i*x], {x, -Pi, Pi}]],
  {"KeyDown" :> i++}
  ]

这是一个用Animate 制作的稍微花哨的界面:

Animate[Plot[Sin[i*x], {x, -Pi, Pi}], {i, 1, 10, 1}, AnimationRunning -> False]

【讨论】:

  • 感谢您的回答。我已经编辑了我的帖子,希望这次更清楚。
  • 我在编辑中添加了一个示例。不要害怕使用内置工具来处理这类事情,比如AnimateManipulate
【解决方案3】:

如果你真的想让用户在 Plots 之间按下一个键,最简单的方法可能是

For[i = 1, i <= 10, i++, 
    If[!ChoiceDialog[Plot[Sin[i*x], {x, -Pi, Pi}], 
         WindowTitle -> "Plot #" <> ToString[i] 
                                 <> ":  Press OK or Enter to continue"],
    Abort[]]]

【讨论】:

  • 我一直按 OK 按钮,但没有任何反应。顺便说一句,取消按钮也不起作用。它是您的程序中的错误,还是只是 Mozilla 兼容性问题?
  • @belisarius:你让我走了一秒钟......:P
  • Simon,恭喜你突破了 3K 代表。
  • @Mr.Wizard:谢谢!不过,你正在快速追赶……你在本月排名前 2%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多