Как показать графики внутри цикла в Mathematica - PullRequest
13 голосов
/ 07 апреля 2011

Мне интересно, есть ли у вас хорошие способы показывать графики в цикле в MMA. Обычно вывод функции Plot не отображается, например, в следующем коде:

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

Спасибо за вашу помощь.

Редактировать

В связи с моим предыдущим вопросом у меня уже есть цикл For, например, вот так For[i = 1, i <= 10, i++, Plot[Sin[i*x], {x, -Pi, Pi}]]. Учитывая этот факт, я хочу, чтобы внутри цикла For было что-то вроде «нажать любую клавишу для продолжения ...», а затем обновлять график каждый раз, когда я нажимаю любую произвольную клавишу. Кто-нибудь может дать полный рабочий код?

Ответы [ 3 ]

16 голосов
/ 07 апреля 2011

Просто используйте 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)}]
 ]
13 голосов
/ 07 апреля 2011

Просто верните список графиков, вместо использования цикла 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

ОБНОВЛЕНИЕ

Вот один простой способ использования Dynamic и EventHandler:

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]
5 голосов
/ 07 апреля 2011

Если вы действительно хотите, чтобы пользователь нажимал клавишу между графиками, самый простой способ может быть

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...