使交互式matplotlib窗口不会在每次更新时弹出到最前面(Windows 7)

2024-03-29 10:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

今天,我把matplotlib升级到2.0.2版本,之前可能有3年没有升级了。在

现在我有个问题,在交互式绘图中,窗口总是在前面,好像这里make matplotlib plotting window pop up as the active one已经成为默认行为。在

如何停用它?我不希望窗口每5秒出现在我的文本编辑器,浏览器。。。在

我希望它保持在我放置它的z顺序中,不管是在活动窗口的前面还是后面。在

我认为,2016年1月31日的以下提交是造成这一问题的原因:tkagg: raise each new window; partially addresses #596

在Github上找到相关注释https://github.com/matplotlib/matplotlib/issues/596#issuecomment-305298577

似乎是我对plt.pause的调用引起了这个问题,而不是plt.plot调用。在


Tags: the版本绘图makematplotlibas浏览器plt
3条回答

更改后端

此问题似乎仅在使用Tk后端时出现。使用Qt后端,当使用plt.pause更新时,窗口将保持在原来的位置。在

要更改后端,请在脚本开头使用这些行。在

import matplotlib
matplotlib.use("Qt4agg") # or "Qt5agg" depending on you version of Qt

修改plt.pause

如果更改后端不是一个选项,那么下面的方法可能会有所帮助。窗口不断弹出到前面的原因来自于plt.pause内部调用plt.show()。因此,您实现了自己的pause函数,而不调用show。这要求首先处于交互模式plt.ion(),然后至少调用plt.show()。然后,您可以使用如下所示的自定义mypause函数更新绘图。在

^{pr2}$

使用animation

最后,使用matplotlib.animation类将使上述所有内容过时。一个matplotlib.animation.FuncAnimation的例子显示了on the matplotlib page。在

现在是2019年4月,Matplotlib 3.0.3的mypause()函数(从最新的pyplot实现中复制)应该更像

import time
import matplotlib.pyplot as plt
def mypause(interval):
    manager = plt._pylab_helpers.Gcf.get_active()
    if manager is not None:
        canvas = manager.canvas
        if canvas.figure.stale:
            canvas.draw_idle()        
        #plt.show(block=False)
        canvas.start_event_loop(interval)
    else:
        time.sleep(interval)

经过一些测试(Qt5 backend/Spyder/Windows 7 64bit)后,对我来说有帮助的调用是:

^{pr2}$

无花果是你的图形对象。在我的情况下,两种方法都不起作用。根据animation文档,这本质上就是FuncAnimation所做的。在

我在Mac上也遇到了同样的问题。我不确定这是否是最好的方法,但是我没有使用plt.pause(0.001),而是改为fig.canvas.start_event_loop(0.001)来更新动画中的每一帧。这样可以使窗口保持在后台。在

相关问题 更多 >