【问题标题】:show() doesn't redraw anymoreshow() 不再重绘
【发布时间】:2011-02-16 20:47:06
【问题描述】:

我在 linux 中工作,我不知道为什么使用 python 和 matplotlib 命令只绘制一次我想要的图表。 我第一次调用 show() 时,情节被绘制,没有任何问题,但不是第二次和以下。

我关闭了显示两个调用之间图表的窗口。你知道为什么和热修复它吗?

感谢 AFG

从 numpy 导入 * 从 pylab 导入 * 数据 = 数组([1,2,3,4,5]) 情节(数据) [] show() # 这个调用显示了一个情节 #..现在我关上窗户... 数据 = 数组([1,2,3,4,5,6]) 情节(数据) [] show() # 这个不显示任何东西

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    在 Windows 中这很完美:

    from pylab import *
    plot([1,2,3,4])
    [<matplotlib.lines.Line2D object at 0x03442C10>]
    #close window here
    plot([1,2,3,4])
    [<matplotlib.lines.Line2D object at 0x035BC570>]
    

    您是否尝试过:

    from matplotlib import interactive
    interactive(True)
    

    有时 matplotlib 会产生一些令人头疼的问题,因为我们必须记住在 matplotlibrc 中设置了一些选项(例如后端或交互参数)。如果您使用来自不同编辑器(IDLE-tk、pycrust-wxpython)的 matplotlib 或与脚本交替交互,那么您必须考虑到在一种模式下工作的配置可能会在另一种模式下给您带来问题,并且必须以编程方式进行修改或使用专用的配置文件。

    我给出的示例可以直接工作(并且没有 show()),因为在 matplotlibrc 中我将交互式设置为默认设置为 True

    【讨论】:

    • 感谢您的回复,但它不起作用。可能我有一些问题,因为现在当我尝试关闭窗口时,操作系统说它没有响应。
    • 您使用的是哪个 shell/IDE?你设置了哪个后端?使用 ipython 时你会遇到同样的问题吗?
    【解决方案2】:

    您的编辑器/IDE 窗口系统和绘图窗口之间可能存在冲突。

    解决这个问题的一个很好的方法是使用IPython。 IPython 是一个很棒的交互环境,并且已经解决了这些问题并且还有许多其他的优点。首先,使用命令(从终端窗口)ipython -pylab 启动 IPython,使其进入交互式 pylab 模式。

    【讨论】:

      【解决方案3】:

      我猜您是在 Windows 上的 IDLE 中执行此操作,因为那是我注意到同样问题的地方。

      根据我的推断,在使用带有 IDLE 的 matplotlib 时,使用 TkAgg 后端存在问题,该后端带有基本的 Python dist 并且似乎是 matplotlib 的默认设置。它与 IDLE 使用子进程的方式有关,因为如果我使用禁用子进程的 -n 选项启动 IDLE,我就没有这个问题。在 Windows 上使用 -n 选项启动它的简单方法是右键单击并文件并选择“使用 IDLE 打开”。如果你这样做,你应该得到一个 IDLE shell,上面写着 === 没有子进程 ===

      就在提示上方。例如,从 joaquin 的解决方案中借用代码,您可以尝试以下简单代码:

      from matplotlib import interactive
      interactive(True)
      from pylab import *
      plot([1,2,3,4])
      

      然后关闭窗口并再次在控制台中键入最后一行。使用 -n 选项在 IDLE 中对我有用。

      那你能做什么?您始终可以在没有子进程的模式下运行 IDLE,但这样做是有危险的。您可以使用不同的 IDE。很多人建议使用 IPython,尽管我自己还没有推销它。您也可以为 matplotlib 尝试不同的后端。我会在一段时间内尝试一下,因为我一直在想它是否会起作用。

      【讨论】:

        【解决方案4】:

        show() 只能在程序中使用一次,在最后:它是一个永无止境的循环,用于检查图形窗口中的事件。

        做你想做的事的正常方式是:

        # … plot …
        draw()  # Draws for real
        raw_input()  # Or anything that waits for user input
        
        # … 2nd plot …
        draw()
        raw_input()
        
        # Last plot
        show()  # or, again, draw(); raw_input()
        

        您可以尝试看看这是否适合您。

        或者,您可以尝试更改后端,因为某些后端比其他后端工作得更好:

        import matplotlib
        matplotlib.use('TkAgg')  # For other backends, do matplotlib.use('') in a shell
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-15
          • 2019-11-03
          • 1970-01-01
          • 2017-05-13
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多