Matplotlib库的python show()方法立即返回

61

我有一个简单的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 ...,它确实保持了图形的打开状态,但它曾经可以在没有那个的情况下工作,并尝试在脚本中运行plt.ion()并以正常模式运行,但没有成功。


5
Code是Stack Overflow的主要话题。给我们一些。 - joaquin
你说得对。我尝试用一个更简单的例子来复现它,但是失败了。我会尝试精简代码并指出问题的源头。 - gpierris
一个解决方法可以是在脚本的最后一行使用raw_input()。 - joaquin
我想到了使用time.sleep,但是图形处理程序不起作用,导致程序冻结,因此我放弃了这个想法,但你是正确的。使用raw_input就不会有这个问题! - gpierris
很好,还是应该能够在不使用raw_input的情况下正常工作。你在某个地方出了问题。尝试编写一段代码来重现这种效果。或者反过来,在你删除以准备现在正常工作的代码中找到问题! :-) - joaquin
5个回答

72

我曾经遇到过同样的问题,原因是在Figure对象上调用了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()

这也是我的问题,但只在独立的Python中出现。在Anaconda中一切正常。那么......这是一个Bug还是一个Feature? - Franz Forstmayr
我在Anaconda中遇到了问题。图形窗口打开,但没有绘制任何内容,然后窗口会自动关闭。有什么帮助吗?我尝试了上面给出的简单示例中的fig.show()和plt.show()。我的matplotlib版本是3.4.3。 - Kartik Podugu

62

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


2
谢谢你的回答,但不是这个问题。可能那是旧版本的信息。它只告诉我块(block)是一个意外的参数。 - gpierris
1
@gpierris show 函数的 block 参数至少在 matplotlib 1.1.0 中存在。然而,如果您以前没有在代码中更改过模式,则默认值为 block,因此将其设置为 True 是不相关的。 - joaquin
在 matplotlib 2.2.3 中工作过。 - vindarmagnus
1
你太棒了!我不确定是pandas还是vscode导致的,但在我使用vscode进行调试时,明确执行plt.show(block=True)是必要的。 - daparic
1
顺便提一下,如果 isinteractive=False,那么 block=True 只是默认设置。因此,“正确”的修复方法可能是 plt.ioff(),如下面的答案中所述。 - user202729

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,在两个系统(64位)上的所有可用python控制台和IDE上都有效。然而,在Linux(SuSe 11.3,64位)上无法工作,因此这里肯定存在某些平台依赖性。


5
为了在调用Figure对象的show()方法时,使用tkagg后端来复制matplotlib.show()的行为:
import Tkinter as Tk
import matplotlib.pyplot as plt
fig = plt.figure()
... your plot commands...
fig.show()
Tk.mainloop()

1
Tkinter 不是一个包,它是 tkinter。 - thang
2
他的示例适用于Python2,而在Python3中则是使用tkinter。https://dev59.com/SV8e5IYBdhLWcg3wRYwk 同时确认,他的解决方案适用于我们特定的用例。谢谢! - Bryan Cote-Chang

1

我遇到了与下面这段代码相同的问题。

import matplotlib.pyplot as plt

plt.ion()
fig,ax0 = plt.subplots(figsize=(5.3,4))

plt.show()

我删除了 plt.ion(),这样图形就不会自动关闭了。


实际上,这个答案已经在 https://dev59.com/22ox5IYBdhLWcg3wVCxy#28028339 中提到了,建议禁用交互模式。 - user202729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接