当要求绘制第二个图表时(关闭第一个图表窗口后),Python Matplotlib挂起

时间:2009-08-02 17:53:37

标签: python matplotlib

奇怪的行为,我确定这是我搞砸了,但我想深入了解正在发生的事情:

我正在运行以下代码,使用matplotlib创建一个非常简单的图形窗口:

>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x0290B750>]
>>> plt.show()

正如预期的那样,我得到了一个人们所期望的图表,在一个新的窗口中弹出,包含一条非常简单的蓝线,在y轴上再次从1回到1,0,1,2为x轴点(仅作为示例)。现在我关闭图形窗口(使用窗口右上角的十字按钮)。这让我可以控制解释器,然后我重新开始创建新对象:

>>>
>>> fig1 = plt.figure()
>>> bx = fig1.add_subplot(111)
>>> bx.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()

这一次,我得到一个窗框,里面没有任何东西(只是框架,没有白色背景),整个爆炸拍摄都挂了。我必须“结束任务”,python解释器被系统终止,我得到一个命令提示符。在mac上的类似行为(除了它实际上首先绘制图形,然后也挂起)。

所以不知何故Python和/或matplotlib不希望我手动关闭窗口。有人知道发生了什么,我应该做什么?我想做的是在解释器中使用不同的情节,显然这种行为没有帮助。我知道我可以使用“Ipython -pylab”,但为了学习,我想了解上述错误。

感谢。

6 个答案:

答案 0 :(得分:8)

晚会结束三个月,但我在matlibplot文档中发现了一个使用draw()而不是show()的建议;前者显然只是对当前情节进行渲染,而后者启动了所有交互式工具,这就是问题似乎开始的地方。

它在文档中并不是非常突出,但这里是链接: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

对于它的价值,我已经尝试了pylab.show()并且你遇到了完全相同的问题,而pylab.draw()似乎可以正常工作,如果我只想查看输出。

答案 1 :(得分:2)

您是否尝试过使用ipython而不是标准的python解释器?

您可以使用以下命令安装ipython:

easy_install ipython

然后,ipython有一个特定的模式用pylab运行,叫做-pylab:

ipython -pylab

In[1]: ...

我认为大多数人使用这个解决方案用python绘制图形,它是一个类似于R / Matlab,completition等的命令行...它为每个绘图运行一个单独的线程,所以它不应该有你描述的问题。

答案 2 :(得分:2)

显然,这是由tkinter后端的错误引起的。例如,见https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834。它正在...... 如果你可以回归到一个稍微老一点的tkinter库,那应该是暂时的解决方法(几周前我碰到了同样的事情,这是我唯一的希望)。

答案 3 :(得分:0)

你试过了吗?

plt.close()

确保你关闭了情节对象?

答案 4 :(得分:0)

如上所述:

对所有情节使用plt.draw(),除了最后一个。

对于您的上一个情节,请使用plt.show()

这很奇怪,但是如果你不在最后一个中使用plt.show()并尝试使用plt.draw(),则看不到任何情节。

祝你好运!

答案 5 :(得分:0)

使用TkAgg作为后端时出现此问题。使用plt.close('all')后我的计算机冻结了。

解决方案是切换到不同的后端。我现在改用Qt4Agg。

如果您有Qt4Agg installed,可以通过输入以下内容来切换后端:

plt.switch_backend('Qt4Agg')
在绘制数据之前