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

时间:2015-01-14 13:08:29

标签: python matplotlib

有没有办法在Python 2.65,Matplotlib 0.99中显示一个pyplot数字,而不锁定其他所有内容?

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

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

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

理想情况下,我正在寻找可以在我工作的两个环境中运行的代码,但此时我愿意妥协...

更新: 我发现一些代码在相同的环境中运行,能够执行所有这些操作,我可以删除plt.show()调用,甚至在IDLE中运行它(根据matplotlib文档在这些问题上有问题),并且它“正常工作” - 我无法找到两个代码如何处理任务的任何区别:两者都定义了一个figure.axes对象,将它传递给绘制它们的例程(使用plt.plot()并存储以备将来使用。

我还发现我当前的代码会改变它在当前库集上的行为,具体取决于我如何运行它:在Spyder或系统控制台的“常规”控制台中,一切都很好,但是在专用的在Spyder的控制台中,第一个图将锁定界面

=>我开始认为这毕竟与matplotlib版本无关,但不知道在哪里可以看 - 有没有其他任何改变matplotlib的行为,基于它是如何发布的?

2 个答案:

答案 0 :(得分:2)

看起来你正在寻找:

plt.show(block=False) 

plt.ion

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

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

答案 1 :(得分:1)

elyase的回答让我朝着正确的方向前进:

import matplotlib
matplotlib.interactive(True)

这在脚本的开头是确保matplotlib将始终在所有环境中以允许脚本继续运行的方式创建绘图所需的内容,同时允许用户操纵图形和代码以保持吸收它。

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打开图,能够绘制到现有图中)并且在GUI关闭之前不会弹出单个绘图窗口,然后他们都向我跳了......似乎让matplotlib在任何地方都表现得同样轻而易举。