代码之家  ›  专栏  ›  技术社区  ›  Thomas Browne

Python Matplotlib在被要求绘制第二个图表时挂起(关闭第一个图表窗口后)

  •  9
  • Thomas Browne  · 技术社区  · 16 年前

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

    我正在运行以下代码,以使用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()
    

    正如预期的那样,我得到了一张图表,在弹出的新窗口中,包含一条非常简单的蓝线,从1到3,再回到y轴上的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()
    

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

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

    谢谢

    6 回复  |  直到 16 年前
        1
  •  8
  •   Rich    16 年前

    派对迟到了三个月,但我在matlibplot文档中发现了一个建议,即使用draw()而不是show();前者显然只是渲染当前情节,而后者启动所有交互工具,这似乎是问题的开始。

    http://matplotlib.sourceforge.net/faq/howto_faq.html#use-show

    值得一提的是,我尝试了pylab.show()并遇到了与您完全相同的问题,而pylab.draw()似乎可以很好地工作,如果我只想查看输出的话。

        2
  •  2
  •   co co    16 年前

    https://bugs.launchpad.net/ubuntu/+source/matplotlib/+bug/313834 . 正在进行中。。。 如果你可以回归到一个稍微旧一点的tkinter库,那应该是暂时的解决办法(我在几周前遇到了同样的事情,这是我唯一的希望)。

        3
  •  2
  •   Autoplectic    16 年前

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

    easy_install ipython
    

    ipython -pylab
    
    In[1]: ...
    

    我认为大多数人使用这个解决方案用python绘制图形,它是一个类似于R/Matlab、Completion等的命令行。。。它为每个绘图运行一个单独的线程,因此不应该出现您描述的问题。

        4
  •  0
  •   Nope    16 年前

    您是否尝试过:

    plt.close()
    

    是否要确保已关闭打印对象?

        5
  •  0
  •   Adri C.S. nicogui    13 年前

    如上图所示:

    使用 plt.draw() 除了最后一个,你所有的情节。

    对于最后一个绘图,请使用 plt.show()

    这很奇怪,但如果你不使用 在最后一个,试试看 相反,你看不到任何情节。

    祝你好运!

        6
  •  0
  •   Yonatan Simson    9 年前

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

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

    如果你有 Qt4Agg installed 可以通过键入以下内容切换后端:

    plt.switch_backend('Qt4Agg')
    

    在绘制数据之前