可靠地显示 matplotlib(0.99 到 1.3.1)图形而不会阻塞

reliably show matplotlib (0.99 to 1.3.1) figures without blocking

有什么方法可以在 Python 2.65、Matplotlib 0.99 中显示 pyplot 图,而不锁定其他所有内容?

我在 Python 2.75 和 Matplotlib 1.3.1 上有一个带有 Pmw GUI 运行ning 的程序。在 Windows(64 位 Winpython)上。 每次绘制图形(或每次向现有图形添加某些内容时),例程都会调用 plt.show()。 可以在允许用户继续使用 GUI 和操作图形的同时显示 pyplot 图形,没有任何东西阻止任何东西,正如我希望的那样,因为我需要用户在决定下一步在 GUI 中做什么时查看图形, 并有几个地块彼此相邻进行比较。

现在,我需要在 Python 2.65 和 Matplotlib 0.99 的系统上完成所有这些工作。现在的行为似乎是,除非调用 plt.show() ,否则什么都不可见,然后它将阻止所有内容,直到情节 window 关闭。 我尝试使用 plt.draw() 代替,但后来这个数字甚至没有出现。 更糟糕的是:一些绘制现有图形的例程永远没有机会,因为它们无法在显示图形时执行,而当它们可以执行时,图形已经消失了。我等不及最后一次绘图操作了,因为这些图表是用来构建增量的,将信息添加到用户需要能够看到的现有图表中。

我不允许更新 matplotlib。如果我将它们作为 "my" 软件包的一部分,我可以使用库的非二进制部分。

理想情况下,我正在寻找可以在我工作的两种环境中工作的代码,但在这一点上我愿意做出妥协...

更新: 我在相同的环境中发现了一些代码 运行ning 能够完成所有这些事情,我可以在其中删除 plt.show() 调用,甚至 运行 它处于空闲状态(根据 matplotlib 文档,在这些方面存在问题),并且它 "just works"——我无法发现这两个代码处理任务的方式有任何区别:两者都定义了一个 figure.axes 对象,通过它到绘制到它们中的例程(使用 plt.plot())并存储它以备将来使用。

我还发现我当前的代码会改变其在当前库集上的行为,这取决于我如何 运行 它:在 Spyder 的 "regular" 控制台或系统控制台中, 一切正常,但是在Spyder的专用控制台上,第一个剧情会锁死界面

=> 我开始认为这毕竟与 matplotlib 版本无关,但不知道还有什么地方可以看——是否有其他任何东西可以根据它的启动方式改变 matplotlib 的行为?

您似乎在寻找:

plt.show(block=False) 

plt.ion:

plt.ion()
plt.show()
# update figure, calc stuff
plt.pause()

不确定它们是否在 0.99 中可用。

elyase 的回答让我找到了正确的方向:

import matplotlib
matplotlib.interactive(True)

这在脚本的开头是为了确保 matplotlib 始终在所有环境中以允许脚本继续 运行ning 的方式创建绘图,同时允许用户操作图和继续绘制的代码。

Matplotlib 有两种操作模式:交互式和非交互式,我的脚本进入后一种模式是问题所在。

我仍然不知道为什么这在某些情况下是默认行为而在其他情况下不是(我相信这是每个​​ matplotlib 安装的一个标准设置)。由于其他脚本可以 运行 而无需上述内容。并且我的脚本一定会无意中执行某些操作以进入非交互模式,但是上面的代码将覆盖设置,无论发生什么情况;至少在我迄今为止尝试过的所有场景中:python 2.75,matplotlib 1.3.1 使用 Spyder 的常规和专用 shell 和系统 shell,以及 Py 2.65,matplotlib 0.99,使用系统 shell 和 IDLE。

P.S.: 这似乎对 Linux 没有帮助。我尝试 运行 在 SuSE 13.1(python 2.7 和所有库的当前版本)上使用相同的 skript(打开绘图的 Tkinter GUI,能够绘制到现有绘图中)并且没有单个绘图 window 弹出直到 GUI 关闭,然后他们都跳到我身上......看来让 matplotlib 在任何地方都表现得一样不是微不足道的。