Today I upgraded matplotlib to version 2.0.2, after not upgrading for possibly 3 years.
Now I have the problem that in interactive plots the window always comes to the front, as if this here make matplotlib plotting window pop up as the active one had come to be the default behaviour.
How can I deactivate it? I don't want the window to come to front every 5 seconds and raise over my text editor, browser, ...
I want it to stay in the z-ordering where I've placed it, be it to front or behind an active window.
I believe that the following commit from 31 Jan 2016 is responsible for this problematic behaviour: tkagg: raise each new window; partially addresses #596
Found a related comment on Github https://github.com/matplotlib/matplotlib/issues/596#issuecomment-305298577
it appears that it is my call to
The issue seems only present using the
Tk backend. Using the
Qt backend, the window would stay where it was while updating with
To change the backend use those lines at the beginning of your script.
import matplotlib matplotlib.use("Qt4agg") # or "Qt5agg" depending on you version of Qt
If changing the backend is not an option, the following might help. The cause of the window constantly popping up to the front comes from
plt.show() internally. You therefore implement you own
pause function, without calling
show. This requires to be in interactive mode
plt.ion() first and then at least once call
plt.show(). Afterwards you may update the plot with the custom
mypause function as shown below.
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)
Finally, using a
matplotlib.animation class would render all of the above obsolete. An example for
matplotlib.animation.FuncAnimation is shown on the matplotlib page.