可靠地显示 matplotlib (0.99 到 1.3.1 版本) 图表而不阻塞。

3
有没有办法在Python 2.65、Matplotlib 0.99中显示pyplot图形,而不会锁定其他内容?
我有一个带有Pmw GUI的程序,在Windows(64位Winpython)上运行Python 2.75和Matplotlib 1.3.1。每次绘制图形时(或每次向现有图形添加东西时),程序都会调用plt.show()。可以在允许用户继续使用GUI并操作图形的同时显示pyplot图形,没有任何东西会阻塞,这正是我想要的,因为我需要用户在决定下一步在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个回答

2
看起来你正在寻找:
plt.show(block=False) 

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

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

不幸的是,我发现它是在1.0版本引入的 :( - Zak
很遗憾听到这个消息,希望有人能提出解决方案。 - elyase
我不再认为这是由于plt库版本的问题了 - 其他代码也可以做到这一点,甚至在我的开发系统上,以不同的方式启动脚本会得到不同的结果(请参见上面的更新)。越来越奇怪... - Zak
研究plt.ion()的确切作用是我最终找到解决方案的原因,所以谢谢你! - Zak
很高兴听到它有所帮助! - elyase

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。

附言: 这似乎对Linux没有帮助。我尝试在SuSE 13.1上运行相同的脚本(Tkinter GUI,可以打开图形,能够绘制到现有的图形中),但在GUI关闭之前没有任何一个图形窗口弹出,然后它们都跳出来了……看起来在各个地方让matplotlib表现一致并不是一件容易的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接