【问题标题】:Python Matplotlib hangs when asked to plot a second chart (after closing first chart window)当要求绘制第二个图表时,Python Matplotlib 挂起(关闭第一个图表窗口后)
【发布时间】:2010-11-16 04:55:17
【问题描述】:

奇怪的行为,我确定是我搞砸了,但我想弄清楚发生了什么:

我正在运行以下代码来使用 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,其中 0、1、2 作为x 轴点(仅作为示例)。现在我关闭图形窗口(使用窗口右上方的十字按钮)。这让我可以控制解释器,然后我重新开始,创建新对象:

>>>
>>> fig1 = plt.figure()
>>> bx = fig1.add_subplot(111)
>>> bx.plot((1, 3, 1))
[<matplotlib.lines.Line2D object at 0x029E8210>]
>>> plt.show()

不过,这一次,我得到了一个窗框,里面什么都没有(只有框架,没有白色背景,什么都没有),整个 bang 拍摄挂起。我必须“结束任务”,python 解释器被系统终止,我得到一个命令提示符。 mac 上的类似行为(除了它实际上先绘制图表,然后再挂起)。

所以不知何故 Python 和/或 matplotlib 不希望我手动关闭窗口。有谁知道发生了什么事以及我应该做什么?我想做的是在解释器中使用不同的情节,显然这种行为没有帮助。我知道我可以使用“Ipython -pylab”,但为了学习,我想了解上述错误。

谢谢。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    你试过了吗:

    plt.close()
    

    确保您关闭了绘图对象?

    【讨论】:

    • 我现在有凯西,但没有变化。当我调用 plt.show() 时,它显示 Python 解释器的图形窗口已停止使用,即我没有提示。只有当我关闭窗口时,我才会收到提示。如果我然后调用 plt.close() 然后继续,它的行为方式完全相同,即挂起。感觉(在 Matplotlib 网站上挖掘)他们基本上希望你在 -pylab 模式下坚持使用 iPython。
    • 尝试下载 scipy,如果你还没有它并导入 pylab。它就像 matplotlib 一样工作。
    • 不——也没有。如果导入 pylab 并执行上述所有操作,其行为方式完全相同。
    【解决方案2】:

    您是否尝试过使用 ipython 代替标准的 Python 解释器?

    您可以使用以下命令安装 ipython:

    easy_install ipython
    

    然后,ipython 有一个特定的模式可以用 pylab 运行,称为 -pylab:

    ipython -pylab
    
    In[1]: ...
    

    我认为大多数人使用这个解决方案来用 python 绘制图形,它是一个类似于 R/Matlab、完成等的命令行......它为每个绘图运行一个单独的线程,所以它应该没有你描述的问题。

    【讨论】:

    • 谢谢 - 是的,我知道 Ipython 路线(见上面的 cmets)。确实,看起来这是要走的路,尽管它也可能有点不可预测。我认为你是对的。 Basicall Ipython 是前进的方向。
    【解决方案3】:

    显然,这是由 tkinter 后端中的错误引起的。参见,例如,https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834。它正在处理中... 如果您可以退回到稍旧的 tkinter 库,那应该是暂时的解决方法(几周前我遇到了同样的事情,这是我唯一的希望)。

    【讨论】:

      【解决方案4】:

      晚会晚了三个月,但我在 matlibplot 文档中找到了使用 draw() 而不是 show() 的建议;前者显然只是对当前情节进行渲染,而后者则启动了所有交互式工具,这似乎是问题开始的地方。

      它在文档中的位置并不十分显眼,但这里是链接: http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

      对于它的价值,我已经尝试过 pylab.show() 并且遇到了与您完全相同的问题,而 pylab.draw() 似乎可以正常工作,如果我只想查看输出。

      【讨论】:

      • 感谢 Rich - 很有用。三个月还为时不晚,因为实际上我只是在休息一段时间后才回到 matplotlib。
      • 感谢您的链接。我一直对 show() 和 draw() 感到困惑,最后我找到了一些关于它的好信息。
      • 现在是 2014 年,Matplotlib 1.4 出来了,这个答案仍然很重要。
      【解决方案5】:

      正如上面某处发布的那样:

      plt.draw() 用于除最后一个之外的所有图。

      对于你的最后一个情节,使用plt.show()

      这很奇怪,但如果你在最后一个中不使用plt.show() 而是尝试plt.draw(),你看不到任何情节。

      祝你好运!

      【讨论】:

        【解决方案6】:

        我在使用 TkAgg 作为后端时遇到了这个问题。使用plt.close('all')后我的电脑死机了。

        解决方案是切换到不同的后端。我现在改用 Qt4Agg。

        如果您有Qt4Agg installed,则可以通过键入以下内容来切换后端:

        plt.switch_backend('Qt4Agg')
        

        绘制数据之前

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-29
          • 1970-01-01
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多