2014-03-22 3 views
1

Я недавно начал учиться использовать Юлию, переходя из Matlab/Octave. Я решил, что лучший способ получить некоторый опыт - это преобразовать код, который я уже работал над i Octave - решателем Newton для сложной многомерной задачи. Я смог успешно конвертировать код (и с заметным ускорением по сравнению с Octave, без детекторизации или других изменений, основанных на производительности), при этом возникает только одна проблема.PyPlot в Julia только показывает график при завершении кода

Я выбрал использование PyPlot для построения графиков из-за его сходства с функциональностью построения Matlab/Octave. Тем не менее, существует некоторое поведение от PyPlot, которое нежелательно. Я использую функцию построения графика, чтобы отобразить текущее состояние вектора, который я пытаюсь получить до нуля (используя часть кода для решения Newton), чтобы я мог видеть, что он делает, и настройте код, чтобы попытаться улучшить это поведение. Я ввожу количество шагов Newton, которые нужно выполнить до того, как код остановится, а затем я могу внести корректировки или повторно выполнить команду, чтобы продолжить попытки сближения.

У меня есть код, настроенный для построения текущего состояния каждые несколько шагов, так что я могу, например, сделать код на 200 шагов, но показать статус после каждых 10 шагов. В Octave это прекрасно работает, предоставляя мне самую свежую информацию - если поведение кода нежелательно, я могу быстро отменить код с помощью Ctrl-C (эта часть работает и в Julia).

Однако Julia не производит или не обновляет графики при использовании команды plot(); вместо этого он создает сюжет или обновляет его, если окно графика уже открыто, только когда код заканчивается. Это полностью нарушает цель прерывистого построения внутри кода. Как только код будет завершен, график будет правильно сгенерирован, поэтому я знаю, что сама команда plot() используется правильно.

Я попытался добавить либо draw(), либо show() сразу после команды plot. Я также попробовал отображение (gcf()). Ни один из них не изменил результат. Я подтвердил, что isinteractive() выводит «true». Я также попытался отключить интерактивность (ioff()) и переключиться на использование бэкэнда python или julia (pygui (true) и pygui (false)), не влияя на это поведение.

Я что-то пропустил? Есть ли другой пакет или параметр, который необходимо установить, чтобы заставить PyPlot немедленно генерировать текущий сюжет, а не ждать, пока Джулия закончит свой текущий запуск кода, чтобы создать сюжет?

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

Я использую xubuntu 12.10 с Julia 0.2.1.

+2

https://github.com/stevengj/PyPlot.jl/issues/41 –

+0

@ Исаия - Спасибо - возможно, вы могли бы написать ответ (с прямым упоминанием о «урожайности»), чтобы я мог отметить его как правильный ответ, дайте вам очки повторения и упростите для кого-либо еще решение проблемы с этой проблемой. Я выполнил ряд поисков информации о том, как решить эту проблему, и что проблема с PyPlot никогда не появлялась для меня. –

+0

Недавно было обсуждено что-то, что, вероятно, связано с группой Google. https://groups.google.com/forum/#!topic/julia-users/Wb5hgyj2PMY – Jeremy

ответ

0

PyPlot по умолчанию использует REPL. Чтобы они отображали графики, как они нарисованы типа ion(). Чтобы отключить его снова, введите ioff().

ion() действует только для текущего сезона, поэтому, если вы хотите, чтобы он оставался на всех сеансах, просто добавьте его в свой файл .juliarc.

Если вы используете iPython ion(), он будет отображаться в новом окне, но ioff() построит линию.