Matplotlib python show()立即返回

63 投票
5 回答
103595 浏览
提问于 2025-04-17 13:01

我有一个简单的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 个回答

9

我遇到了一个叫做逆问题的情况,发现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位)上就不行,所以这里肯定有一些平台依赖的问题。

62

我觉得使用 show(block=True) 这个方法应该能解决你的问题。

75

我也遇到过这个问题,原因是我在图形对象上调用了 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()

撰写回答