web-dev-qa-db-fra.com

faire apparaître la fenêtre de traçage matplotlib en tant que fenêtre active

Je travaille avec python et matplotlib sur mac os x . Lorsque je travaille sur différentes fenêtres et que je dois exécuter un script produisant un tracé, la fenêtre du tracé s'ouvre toujours derrière la fenêtre active et est très frustrante avoir à passer d’une fenêtre à l’autre pour regarder l’image ..___ Est-ce que c’est pourquoi choisir l’emplacement de la fenêtre de tracé, et/ou l’afficher en tant que fenêtre au premier plan?

merci

33
Luca Fiaschi

Je suis dérangé par exactement le même problème. J'ai finalement trouvé une solution (en mode pylab, avec le backend qt4agg):

get_current_fig_manager().window.raise_()

ou

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

Cordialement, Markus

13
mrossi

Pour moi (OSX 10.10.2, Matplotlib 1.4.3), ce qui fonctionne est de changer le back-end de matplotlib en TkAgg. Avant d'importer pyplot ou quoi que ce soit, allez:

import matplotlib
matplotlib.use('TkAgg')  

Les fenêtres de traçage apparaissent maintenant et peuvent être commandées.

14
Peter

J'ai constaté que cette solution était si souvent nécessaire (par exemple, lors de l'utilisation de Spyder IDE), que je l'ai intégrée à une fonction.

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_()
4
raysabr

J'ai trouvé une bonne réponse à ce sujet: Comment faire passer une fenêtre Tkinter au premier plan?

En gros, l’idée est d’utiliser des attributs de fenêtre - définissez l’attribut '-topmost' sur True (1) pour que la fenêtre passe au premier plan, puis sur False (0) pour permettre ultérieurement à d'autres fenêtres d'apparaître dans devant elle. Voici le code qui a fonctionné pour moi:

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

Pour MacOS Sierra et Python 3.6, Matplotlib 2.0.0

get_current_fig_manager().show()

la ligne ci-dessus fait le travail pas besoin de rien d'autre.

1
H S Rathore

Cela a fonctionné pour moi !!

(Testé sous Mac OS X 10.11, Spyder 2.3.5.2 - Python 3.4)

Allez dans Préférences> Console IPython> Graphiques et définissez un backend sur Qt (vous devez ensuite redémarrer le noyau). 

Créez un fichier contenant:

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

et importez-le au démarrage (Préférences> Console IPython> Démarrage> Exécuter un fichier). Maintenant, appelez simplement la fonction raise_window() sous votre code.

Exemple:

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()
1
DomenR

Pour moi, seuls les travaux suivants (avec backend TkAgg):

plt.gcf().canvas.get_tk_widget().focus_force() 
0
Apostolos

Vous pouvez définir 

backend      : MacOSX

dans votre fichier matplotlibrc pour une solution permanente.

Cela fonctionne pour moi sur macos mojave, avec matplotlib 2.1.2. Cependant, d'autres utilisateurs se sont plaints du fait que cela ne fonctionne pas pour eux, de sorte que d'autres paramètres pourraient l'affecter

0
blue_note

À partir de matplotlib 1.5.1 sous MacOSX 10.11.6, si vous démarrez un iPython (5.0.0, Python: 3.5.2) Shell et utilisez% matplotlib , vous pouvez afficher un tracé matplotlib à l’avant avec:

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

** Edit: Le conseil semble être de ne pas utiliser% pylab car il pollue l’espace de nommage global **

.. Shell et utilisez %pylab vous pouvez amener un tracé matplotlib au premier plan en utilisant:

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