Matplotlib python show()立即返回
我有一个简单的Python脚本,可以在同一个图形中绘制一些图表。所有的图表都是通过draw()函数创建的,最后我调用show()函数来显示图形并让它保持在屏幕上。
这个脚本在Python 2.6.6、Matplotlib 0.99.3和Ubuntu 11.04上运行得很好。但是当我在Python 2.7.2、Matplotlib 1.0.1和Ubuntu 11.10上运行时,show()函数立刻返回,没有等待图形关闭。
这是个bug吗?还是说这是个新特性,我们需要修改我们的脚本?有没有什么想法?
补充:在交互模式下,它确实可以保持图形打开,也就是用python -i ...来运行,但以前不需要这样做。我还尝试在脚本中加上plt.ion()并在正常模式下运行,但还是没有成功。
5 个回答
我遇到了一个叫做逆问题的情况,发现matplotlib在不同的环境下会以互动模式或非互动模式运行,这些情况我没法完全搞清楚(在IDLE里一种方式,在系统控制台里另一种,在普通的spyder控制台又是一种,专用控制台又是另一种……)
这个方法对我有效:
import matplotlib
matplotlib.interactive(False)
(其实,我想要的是互动模式,但在你的情况下,逆问题应该能帮到你。)ion()
和ioff()
应该是做同样的事情,但上面提到的是在matplotlib的层面,而不仅仅是pyplot或pylab。这个方法对我有效,尽管我后来是单独导入pyplot,并且再也没有直接调用matplotlib。我在想,plt.ion()可能只对pyplot有影响,而对使用pyplot时可能涉及的其他matplotlib组件没有影响。
这个方法在Windows 7上对我有效,使用的是Python 2.65搭配matplotlib 0.99和Python 2.75搭配matplotlib 1.3.1,在这两个系统的所有可用python控制台和IDE上都能用(都是64位)。不过,这个方法在Linux(SuSe 11.3,64位)上就不行,所以这里肯定有一些平台依赖的问题。
我觉得使用 show(block=True)
这个方法应该能解决你的问题。
我也遇到过这个问题,原因是我在图形对象上调用了 show()
,而不是在 pyplot 对象上调用。
错误的代码。会导致图表在屏幕上闪烁一下:
import matplotlib.pyplot as plt
x = [1,2,3]
y = [5,6,7]
fig = plt.figure()
plt.plot(x, y)
fig.show()
最后一行应该改成这样,才能让图表一直显示,直到你关闭它:
plt.show()