make matplotlib plotting window pop up as the active one

Question:

I’m working with python and matplotlib on mac os x.
When I’m working on many different windows and I have to run a script which produces a plot, the plot window always open behind the active window and is very frustration having to switch between windows for looking at the image.
Is it any why to decide the location of the plot window, and/or pop up it as foreground window?

thanks

Asked By: Luca Fiaschi

||

Answers:

I was bothered by exactly the same problem. I found finally a solution (in pylab mode, with qt4agg backend):

get_current_fig_manager().window.raise_()

or

fig = gcf()
fig.canvas.manager.window.raise_()

Regards,
Markus

Answered By: mrossi

I found a good answer on this thread:
How to make a Tkinter window jump to the front?

Basically, the idea is to use window attributes – set the ‘-topmost’ attribute to True (1) to make the window come to the foreground, and then set it to False (0) so that it later allows other windows to appear in front of it. Here’s code that worked for me:

import matplotlib.pyplot as plt
wm = plt.get_current_fig_manager() 
wm.window.attributes('-topmost', 1)
wm.window.attributes('-topmost', 0)
Answered By: antoniorohit

I found this solution was so often needed (e.g. when using Spyder IDE), I wrapped it into a function.

def show_plot(figure_id=None):    
    if figure_id is None:
        fig = plt.gcf()
    else:
        # do this even if figure_id == 0
        fig = plt.figure(num=figure_id)

    plt.show()
    plt.pause(1e-9)
    fig.canvas.manager.window.activateWindow()
    fig.canvas.manager.window.raise_()
Answered By: raysabr

For me (OSX 10.10.2, Matplotlib 1.4.3), what works is changing the matplotlib backend to TkAgg. Before importing pyplot or anything, go:

import matplotlib
matplotlib.use('TkAgg')  

Plot windows now pop-up, and can be Command-Tab’ed to.

Answered By: Peter

This worked for me!!

(Tested on Mac OS X 10.11, Spyder 2.3.5.2 – Python 3.4)

Go to Preferences > IPython console > Graphics and set a backend to Qt (after that you need to restart the kernel).

Make a file that contains:

def raise_window(figname=None):
    if figname: plt.figure(figname)
    cfm = plt.get_current_fig_manager()
    cfm.window.activateWindow()
    cfm.window.raise_()

and import it at startup (Preferences > IPython console > Startup > Run a file). Now, just call function raise_window() below your code.

Example:

import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)

plt.figure()
plt.plot(X, C)
plt.plot(X, S)

raise_window()
Answered By: DomenR

As of matplotlib 1.5.1 on MacOSX 10.11.6, if you start an iPython (5.0.0, Python: 3.5.2) shell and use %matplotlib you can bring a matplotlib plot to the front using:

>>> %matplotlib
Using matplotlib backend: MacOSX
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,3,2,4])
>>> plt.show()

** Edit: Advice seems to be not to use %pylab as it pollutes the global name space **

.. shell and use %pylab you can bring a matplotlib plot to the front using:

>>> %pylab
Using matplotlib backend: MacOSX
Populating the interactive namespace from numpy and matplotlib
>>> plot([1,3,2,4])
>>> show()
Answered By: AJP

For MacOS Sierra and python 3.6, Matplotlib 2.0.0

import matplotlib.pyplot as plt
plt.get_current_fig_manager().show()

the above line does the job no need of anything else.

Answered By: H S Rathore

For me only the following works (with TkAgg backend):

plt.gcf().canvas.get_tk_widget().focus_force() 
Answered By: Apostolos

You can set

backend      : MacOSX

in your matplotlibrc file for a permanent solution.

It works for me on macos mojave, with matplotlib 2.1.2. However, other users have complained that it does not work for them, so it might be affected by other settings

Answered By: blue_note

The following worked on Jupyter notebook with Qt5 backend on Windows. I tested it with Python 3.7, matplotlib 3.2.1.

%matplotlib qt5
import matplotlib.pyplot as plt
import numpy as np
from PyQt5 import QtCore
plt.plot(np.linspace(0,1))
window = plt.get_current_fig_manager().window
window.setWindowFlags(window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
plt.show()
window.setWindowFlags(window.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
plt.show()
Answered By: akarin64
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.