Julia 中的 PyPlot 仅在代码结束时显示绘图

Posted

技术标签:

【中文标题】Julia 中的 PyPlot 仅在代码结束时显示绘图【英文标题】:PyPlot in Julia only showing plot when code ends 【发布时间】:2014-04-29 15:57:55 【问题描述】:

我最近开始学习使用 Julia,从 Matlab/Octave 转换过来。我决定获得一些经验的最好方法是转换一些我已经在使用的代码 i Octave - 一个用于复杂多维问题的牛顿求解器。我已经能够成功地转换代码(并且相对于 Octave 有明显的加速,没有去矢量化或其他基于性能的更改),只出现了一个问题。

我选择使用 PyPlot 进行绘图,因为它与 Matlab/Octave 的绘图功能相似。但是,PyPlot 有一些不受欢迎的行为。我使用绘图功能来显示我试图归零的向量的当前状态(使用代码的牛顿求解器部分),以便我可以看到它在做什么,并调整代码以尝试改进这一点行为。我输入在代码停止之前要采取的牛顿步数,然后我可以进行调整或重新发出命令以继续尝试收敛。

我将代码设置为每隔几步绘制一次当前状态,例如,我可以让代码执行 200 步,但每 10 步显示一次状态。在 Octave 中,这可以完美运行,为我提供最新信息 - 如果代码的行为不理想,我可以使用 Ctrl-C 快速取消代码(这部分也适用于 Julia)。

但是,当使用 plot() 命令时,Julia 不会生成或更新绘图;相反,它只在代码完成时生成绘图,或者在绘图窗口已经打开时更新它。这完全违背了代码中间歇性绘图的目的。代码完成后,绘图已正确生成,因此我知道 plot() 命令本身正在正确使用。

我尝试在 plot 命令之后立即添加 draw() 或 show()。我也试过显示(gcf())。这些都没有改变结果。我已经确认 isinteractive() 输出“true”。我还尝试关闭交互性 (ioff()) 并切换是否使用 python 或 julia 后端 (pygui(true) 和 pygui(false)),但对这种行为没有影响。

我错过了什么吗?是否需要设置另一个包或选项以强制 PyPlot 立即生成当前绘图,而不是等到 Julia 完成其当前代码运行来生成绘图?

或者,由于间歇性绘图发生在 while 循环内,这里是否可能是范围造成了问题?

我正在使用 xubuntu 12.10 和 Julia 0.2.1。

【问题讨论】:

github.com/stevengj/PyPlot.jl/issues/41 @Isaiah - 谢谢 - 也许你可以作为答案发布(直接提到“yield”),这样我就可以将其标记为正确答案,给你代表点,并做出贡献对于其他寻求解决此问题的方法的人来说更容易。我进行了多次搜索以获取有关如何解决此问题的信息,但 PyPlot 问题页面从未出现在我面前。 最近在 Google 小组中讨论了一些可能与此相关的内容。 groups.google.com/forum/#!topic/julia-users/Wb5hgyj2PMY 【参考方案1】:

PyPlot 在 REPL 中默认使用此行为。要使其在绘图时显示绘图类型ion()。要再次关闭它,请输入ioff()

ion() 仅对当前季节有效,因此如果您希望它在各个会话中保持不变,只需将其添加到您的 .juliarc 文件中即可。

如果您使用 iPython,ion() 将绘制到新窗口,但 ioff() 将绘制内联。

【讨论】:

以上是关于Julia 中的 PyPlot 仅在代码结束时显示绘图的主要内容,如果未能解决你的问题,请参考以下文章

html 仅在设置了缩略图时显示代码块

仅在 graphql 查询中的初始加载时显示加载指示器

ModalViewController 仅在动画时显示

TabContainer 仅在 windowresize 时显示选项卡

Swift:10.10 中的 NSStatusItem 菜单行为(例如,仅在鼠标右键单击时显示)

TableView 仅在单击时显示内容