Rendre la fenêtre interactive matplotlib non visible sur chaque mise à jour (Windows 7)

Aujourd’hui, j’ai mis à jour matplotlib vers la version 2.0.2, après ne pas avoir mis à jour pendant trois ans.

Maintenant, le problème est que dans les tracés interactifs, la fenêtre arrive toujours au premier plan, comme si cela faisait apparaître la fenêtre de traçage de matplotlib lorsque celle-ci devenait le comportement par défaut.

Comment puis-je le désactiver? Je ne veux pas que la fenêtre apparaisse toutes les 5 secondes et passe par-dessus mon éditeur de texte, mon navigateur, …

Je veux que ça rest dans le z-ordering où je l’ai placé, que ce soit devant ou derrière une fenêtre active.

Je crois que l’engagement suivant du 31 janvier 2016 est responsable de ce comportement problématique: tkagg: relancez chaque nouvelle fenêtre; adresse partiellement # 596

A trouvé un commentaire sur Github https://github.com/matplotlib/matplotlib/issues/596#issuecomment-305298577

il semble que ce soit mon appel à plt.pause qui cause ce problème, et non l’appel plt.plot .

Changer le backend

Le problème semble seulement présent en utilisant le backend Tk . En utilisant le backend Qt , la fenêtre restrait où elle était lors de la mise à jour avec plt.pause .

Pour modifier le backend, utilisez ces lignes au début de votre script.

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

Modifier plt.pause

Si la modification du backend n’est pas une option, les éléments suivants peuvent vous aider. La cause de la fenêtre qui plt.show() constamment au premier plan vient de plt.pause appelant plt.show() interne. Vous implémentez donc votre propre fonction de pause , sans appeler show . Cela nécessite d’être en mode interactif plt.ion() abord, puis au moins une fois d’appeler plt.show() . Ensuite, vous pouvez mettre à jour le tracé avec la fonction mypause personnalisée, comme indiqué ci-dessous.

 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) 

Utiliser une animation .

Enfin, utiliser une classe matplotlib.animation rendrait obsolète tout ce qui précède. Un exemple de matplotlib.animation.FuncAnimation est affiché sur la page matplotlib .

J’ai eu le même problème sur le Mac. Je ne suis pas sûr que ce soit la meilleure approche, mais au lieu d’utiliser plt.pause(0.001) , je suis passé à fig.canvas.start_event_loop(0.001) pour mettre à jour chaque image de mon animation. Cela permet aux fenêtres de restr en arrière-plan.

J’ai réécrit le code pour utiliser matplotlib.animation avec l’aide de cette page de documentation https://matplotlib.org/devdocs/api/animation_api.html#module-matplotlib.animation

Je suis arrivé à cette page à travers celui-ci https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.pause.html

qui indique ce qui suit à propos de matplotlib.pyplot.pause

Cela peut être utilisé pour une animation brute. Pour une animation plus complexe, voir matplotlib.animation.

Cette fonction est expérimentale son comportement peut être modifié ou étendu dans une version ultérieure.