Python Matplotlib在关闭第一个图表窗口后绘制第二个图表时卡住

9 投票
6 回答
11499 浏览
提问于 2025-04-15 13:20

有点奇怪的情况,我觉得可能是我搞错了,但我想弄清楚到底发生了什么:

我在用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到3再回到1,x轴的点是0、1、2(只是举个例子)。然后我关闭了这个图形窗口(用的是右上角的关闭按钮)。这时我又可以控制解释器,开始创建新的对象:

>>>
>>> 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 个回答

2

你有没有试过用ipython来代替标准的python解释器呢?

你可以用下面的命令来安装ipython:

easy_install ipython

然后,ipython有一个专门的模式可以和pylab一起使用,叫做-pylab:

ipython -pylab

In[1]: ...

我觉得大多数人都是用这个方法来用python画图的,它的命令行界面和R/Matlab很像,还有自动补全功能等等。而且它为每个图形运行一个独立的线程,所以应该不会出现你说的问题。

8

虽然我来得有点晚,但我在matplotlib的文档中发现了一个建议:用draw()而不是show()。前者显然只是渲染当前的图,而后者则会启动所有的交互工具,这可能就是问题的根源。

这个建议在文档中并不是特别显眼,不过这是链接: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

顺便说一下,我试过pylab.show(),结果和你遇到的问题一模一样,而pylab.draw()如果只是想查看输出的话,似乎工作得很好。

2

显然,这是因为tkinter这个后台出现了一个错误。你可以看看这个链接,了解更多信息:https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834。现在正在修复这个问题……如果你能把tkinter库降级到稍微旧一点的版本,这应该可以暂时解决问题(我几周前也遇到过同样的情况,那时候这就是我唯一的希望)。

撰写回答