【问题标题】:Matplotlib python show() returns immediatelyMatplotlib python show() 立即返回
【发布时间】:2012-02-14 16:06:58
【问题描述】:

我有一个简单的 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() 函数立即返回,而无需等待杀死图形。

这是一个错误吗?或者一个新功能,我们将不得不改变我们的脚本?有什么想法吗?

编辑: 它确实在交互模式下保持绘图打开,即 python -i ...,但它曾经在没有它的情况下工作,并试图在脚本并在正常模式下运行它,但没有运气。

【问题讨论】:

  • 代码是SO的主要主题。给我们一些
  • 你是对的。我试图用一个更简单的例子来重现它,但不能。我会尽量精简代码并突出显示问题的根源。
  • 解决方法是在脚本的最后一行使用 raw_input()
  • 我想到了它并做了一个 time.sleep ,但是图形处理程序不起作用并且它被冻结了,因此我放弃了这个想法,但你是对的。使用 raw_input 我没有这个问题!
  • 很好,不过,它应该可以在不使用 raw_input 的情况下工作。你在某个地方有问题。尝试将一段代码放在一起,重现该效果。或者反过来,在您删除的代码中找到问题,以准备现在可以工作的代码! :-)

标签: python matplotlib


【解决方案1】:

我认为使用show(block=True) 应该可以解决您的问题。

【讨论】:

  • 感谢您的回答,但没有。可能那是一个旧版本。它只是告诉我阻止是一个意外的参数。
  • @gpierris block show 的参数至少存在于 matplotlib 1.1.0 中。但是,默认是阻止,因此如果您之前没有在代码中更改模式,则将其设置为 True 是不相关的
  • 曾在 matplotlib 2.2.3 中工作
  • 你就是男人!!!我不知道是pandas 还是vscode 导致它,但是当我在vscode 中调试运行时,明确地执行plt.show(block=True)需要
【解决方案2】:

我遇到了同样的问题,它是由在 Figure 对象而不是 pyplot 对象上调用 show() 引起的。

代码不正确。使图表在屏幕上短暂闪烁:

    import matplotlib.pyplot as plt

    x = [1,2,3]
    y = [5,6,7]

    fig = plt.figure()
    plt.plot(x, y)

    fig.show()

最后一行应该如下显示图表,直到它被关闭:

    plt.show()

【讨论】:

  • 这也是我的问题,但仅限于独立 Python。在 Anaconda 中一切正常。所以....这是一个错误还是一个功能?
  • 我的 anaconda 也有问题。图形窗口打开,没有绘制任何内容,窗口自动关闭。有什么帮助吗?我从上面给出的简单示例中尝试了 fig.show() 和 plt.show() 。我有 matplotlib 3.4.3 版
【解决方案3】:

拥有inverse problem,并且基于许多我无法追踪的事情,matplotlib 似乎可以在交互或非交互模式下工作(一种方式在 IDLE 中,另一种在系统控制台中,一种方式在普通 spyder控制台,另一个在专用的...)

这对我有用:

import matplotlib
matplotlib.interactive(False)

(实际上,我想要交互模式,但在你的情况下,反过来应该会有所帮助。) ion()ioff() 应该做同样的事情,但以上是 matplotlib 的级别,而不仅仅是 pyplot 或 pylab。这对我有用,尽管我(稍后)单独导入 pyplot 并且不再调用 matplotlib。我认为 plt.ion() 只对 pyplot 有影响,而不是 matplotlib 的其他组件,在使用 pyplot 时可能会或可能不会涉及。

此方法适用于我在 Windows 7 上使用 Python 2.65 和 matplotlib 0.99 和 Python 2.75 和 matplotlib 1.3.1,在两个系统上的所有可用 python 控制台和 IDE 上(64 位,它们都是)。但是,它在 Linux(SuSe 11.3,64 位)上不起作用,因此这里肯定存在一些平台依赖性

【讨论】:

    【解决方案4】:

    在对 Figure 对象调用 show() 时使用 tkagg 后端复制 matplotlib.show() 行为:

    import Tkinter as Tk
    import matplotlib.pyplot as plt
    fig = plt.figure()
    ... your plot commands...
    fig.show()
    Tk.mainloop()
    

    【讨论】:

    • Tkinter 不是一个包。这是 tkinter。
    • 他的示例对 python2 是正确的,它是 python 3 中的 tkinter。stackoverflow.com/questions/25905540/… 也证实了,他的解决方案适用于我们的特定用例。谢谢!
    【解决方案5】:

    我在下面的代码中遇到了同样的问题。

    import matplotlib.pyplot as plt
    
    plt.ion()
    fig,ax0 = plt.subplots(figsize=(5.3,4))
    
    plt.show()
    

    我删除了plt.ion(),情节仍然没有自动关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 2010-10-14
      • 2018-02-11
      • 2011-10-16
      • 2016-03-10
      • 2014-03-19
      • 2017-05-14
      • 2017-12-11
      相关资源
      最近更新 更多