如何在Mathematica中的循环内显示图形

16

我想知道在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循环内部添加一个"按任意键继续..."的功能,每次按下任意键时都可以刷新绘图。有人能给出一个完整的可用代码吗?


2
它必须是按键操作吗,而且只能向前移动吗?总有Manipulate - Cascabel
@Jefromi:是的,理想情况下我希望能够进行按键检测。 - Qiang Li
3个回答

21

只需使用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 Li
@Qiang You 在我回答后更改了你的问题。你仍然想要它在 For 循环内部吗?与此同时,Michael 已经提供了一个不需要它的答案。 - Sjoerd C. de Vries
@Sjoerd:使用键盘事件来实现这个功能有些棘手,因为笔记本的焦点会移开绘图区域。尝试将其与NotebookMove[]结合使用会遇到问题,因为实际上没有显示绘图。我唯一能想到的解决方法是使用显式(单元格)打印和单元格删除命令... - Simon
@Simon:你能否在这里发布可用的代码?Sjoerd C. de Vries提供的代码在我的电脑上无法运行。我的Mathematica版本是7.0,我一开始以为是因为我使用的是旧版本。谢谢。 - Qiang Li
1
@Simon,你也可以使用PrintTemporary,它的作用类似于Print但会返回一个NotebookInterfaceObject,你可以将它传递给NotebookDelete在同一次评估中删除该单元格。这避免了使用SelectionMove的需要。 - Michael Pilat
显示剩余5条评论

15

不要使用For循环,只需返回图表列表:

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

enter image description here

如果您希望将它们全部连接成一个图形,Show[listOfPlots] 是一种方法:
Show[Table[Plot[Sin[i*x], {x, -Pi, Pi}], {i, 1, 10}]]

enter image description here

更新

以下是一种简单的方法,使用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]

谢谢您的回答。我已经编辑了我的帖子,希望这次更加清晰明了。 - Qiang Li
我在我的编辑中添加了一个例子。也不要害怕使用内置工具,比如AnimateManipulate - Michael Pilat

6

如果您真的希望在绘图之间让用户按键,最简单的方法可能是

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[]]]

enter image description here


3
我一直按OK按钮,但没有任何反应。顺便说一下,取消按钮也不起作用。这是你的程序有bug还是仅仅是Mozilla兼容性问题? - Dr. belisarius
@belisarius:你差点就骗到我了... :P - Simon
1
Simon,恭喜你突破了3K声望。 - Mr.Wizard
@Mr.Wizard:谢谢!不过你进步很快啊……你这个月排名前2%。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接