使交互式matplotlib窗口不会在每次更新时popup(Windows 7)

今天我升级了matplotlib到版本2.0.2,没有升级可能3年后。

现在我有一个问题,在交互式中窗口总是出现在前面,就好像这里使得matplotlib绘图窗口popup,因为活动窗口已经成为默认行为。

我怎样才能停用它? 我不希望窗口每隔5秒到达前面,然后提高我的文本编辑器,浏览器,…

我希望它保持在我已经放置它的zsorting,无论是在活动窗口的前面或后面。

我相信2016年1月31日以后的这个提交是对这个有问题的行为负责: tkagg:提高每个新窗口; 部分地址#596

在Github上find相关评论https://github.com/matplotlib/matplotlib/issues/596#issuecomment-305298577

看来,这是我的电话plt.pause这是造成这个问题,而不是plt.plot调用。

Solutions Collecting From Web of "使交互式matplotlib窗口不会在每次更新时popup(Windows 7)"

改变后端

这个问题似乎只存在于使用Tk后端。 使用Qt后端,窗口将保持原来的位置,同时使用plt.pause进行更新。

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

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

修改plt.pause

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

 import matplotlib matplotlib.use("TkAgg") import matplotlib.pyplot as plt from time import time from random import random plt.ion() # set up the figure fig = plt.figure() plt.xlabel('Time') plt.ylabel('Value') plt.show(block=False) def mypause(interval): backend = plt.rcParams['backend'] if backend in matplotlib.rcsetup.interactive_bk: figManager = matplotlib._pylab_helpers.Gcf.get_active() if figManager is not None: canvas = figManager.canvas if canvas.figure.stale: canvas.draw() canvas.start_event_loop(interval) return t0 = time() t = [] y = [] while True: t.append( time()-t0 ) y.append( random() ) plt.gca().clear() plt.plot( t , y ) mypause(1) 

使用animation

最后,使用一个matplotlib.animation类将会使所有上面的过时。 matplotlib.animation.FuncAnimation的示例显示在matplotlib页面上 。

我重写了代码以使用matplotlib.animation的帮助从这个文档页https://matplotlib.org/devdocs/api/animation_api.html#module-matplotlib.animation

我通过这个https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.pause.html

其中说明了有关matplotlib.pyplot.pause的以下内容

这可以用于粗略的动画。 对于更复杂的动画,请参阅matplotlib.animation。

这个功能是实验性的。 其行为可能会在未来版本中发生变化或延长。