【问题标题】:reliably show matplotlib (0.99 to 1.3.1) figures without blocking可靠地显示 matplotlib(0.99 到 1.3.1)数字而不会阻塞
【发布时间】:2015-01-14 13:08:28
【问题描述】:

有什么方法可以在 Python 2.65、Matplotlib 0.99 中显示 pyplot 图形而不锁定其他所有内容?

我有一个在 Python 2.75 和 Matplotlib 1.3.1 上运行的 Pmw GUI 程序。在 Windows(64 位 Winpython)上。 每次绘制图形(或每次向现有图形添加某些内容)时,例程都会调用 plt.show()。 可以显示 pyplot 图形,同时允许用户继续使用 GUI 和操作图形,没有任何东西会阻塞任何东西,因为我需要用户在决定下一步在 GUI 中做什么时查看图形, 并让多个地块彼此相邻以进行比较。

现在,我需要在使用 Python 2.65 和 Matplotlib 0.99 的系统上完成所有这些工作。现在的行为似乎是除非调用 plt.show() 否则什么都不可见,然后它将阻止所有内容,直到关闭绘图窗口。 我尝试使用 plt.draw() 代替,但后来这个数字甚至没有出现。 更糟糕的是:一些绘制到现有图形的例程永远不会有机会,因为它们在显示图形时无法执行,而当它们可以执行时,图形已经消失了。我不能等到最后一次绘图操作,因为这些图表是为了建立增量,将信息添加到用户需要能够看到的现有图表中。

我不允许更新 matplotlib。如果我将库的非二进制部分作为“我的”软件包的一部分,我就可以使用它们。

理想情况下,我正在寻找可以在我工作的两种环境中工作的代码,但在这一点上我愿意做出妥协......

更新: 我发现一些在同一环境中运行的代码能够完成所有这些事情,我可以在其中删除 plt.show() 调用,甚至在 IDLE 中运行它(根据 matplotlib 文档,这在这些方面存在问题),它“正常工作”——我无法发现这两个代码处理任务的方式有什么区别:两者都定义了一个 figure.axes 对象,将它传递给吸引它们的例程(使用 plt.plot() ) 并将其存储起来以备将来使用。

我还发现,我当前的代码会根据我的运行方式改变它在当前库集上的行为:在 Spyder 的“常规”控制台或系统控制台中,一切都很好,但在专用的在 Spyder 中的控制台,第一个情节将锁定界面

=> 我开始认为这毕竟与 matplotlib 版本无关,但不知道还能去哪里看——根据 matplotlib 的启动方式,还有什么可以改变它的行为吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    看起来您正在寻找:

    plt.show(block=False) 
    

    plt.ion:

    plt.ion()
    plt.show()
    # update figure, calc stuff
    plt.pause()
    

    不确定它们是否在 0.99 中可用。

    【讨论】:

    • 不幸的是,我发现它是在 1.0 中引入的 :(
    • 很伤心,我希望有人能提出解决方案。
    • 我不再认为这是由于 plt 库版本 - 其他代码可以做到这一点,甚至在我的开发系统上,启动脚本的不同方式会产生不同的结果(参见上面的更新) .越来越奇怪了……
    • 研究 plt.ion() 的作用是我找到最终解决方案的原因,谢谢!
    • 很高兴听到它有帮助!
    【解决方案2】:

    elyase 的回答让我朝着正确的方向前进:

    import matplotlib
    matplotlib.interactive(True)
    

    这在脚本的开头是确保 matplotlib 在所有环境中始终以允许脚本继续运行的方式创建绘图,同时允许用户操作图形和代码以保持画进去。

    Matplotlib 有两种操作模式:交互式和非交互式,我的脚本进入后一种模式是问题所在。

    我仍然不知道为什么在某些情况下这是默认行为而不是在其他情况下(我认为这是每个 matplotlib 安装的一个标准设置)。由于其他脚本可以在没有上述内容的情况下运行。并且必须有一些我的脚本无意中进入非交互模式的事情,但上面的代码将覆盖设置,无论发生什么;至少在迄今为止我尝试过的所有场景中:python 2.75,matplotlib 1.3.1 使用 Spyder 的常规和专用 shell 和系统 shell,以及 Py 2.65,matplotlib 0.99,使用系统 shell 和 IDLE。

    附注: 这似乎对 Linux 没有帮助。我尝试在 SuSE 13.1(当前版本的 python 2.7 和所有库)上运行相同的脚本(打开绘图的 Tkinter GUI,能够绘制到现有绘图中)并且在关闭 GUI 之前没有弹出单个绘图窗口,然后他们都扑向我……似乎让 matplotlib 在任何地方都表现得一样并非易事。

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2020-05-29
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多