Après ces instructions dans l'interpréteur Python, on obtient une fenêtre avec un tracé:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Malheureusement, je ne sais pas comment continuer à explorer de manière interactive le chiffre créé par show()
pendant que le programme effectue d'autres calculs.
Est-ce possible du tout? Parfois, les calculs sont longs et il serait utile qu'ils se poursuivent lors de l'examen des résultats intermédiaires.
python
matplotlib
plot
météore
la source
la source
ion()
résout le problème.os.fork()
mais gardez à l'esprit que l'utilisationos.fork()
peut être délicate car vous créez un nouveau processus en copiant l'ancien processus.Réponses:
Utilisez
matplotlib
les appels qui ne bloquent pas:En utilisant
draw()
:Utilisation du mode interactif:
la source
draw()
ne fonctionne pas pour moi, il n'ouvre aucune fenêtre. Cependant, utilisershow(block=False)
au lieu dedraw()
semble faire l'affaire dans matplotlib 1.1.draw()
n'a pas fonctionné pour moi non plus, seulementpause(0.001)
: stackoverflow.com/questions/28269157/…Utilisez le mot-clé «block» pour remplacer le comportement de blocage, par exemple
pour continuer votre code.
la source
Il est préférable de toujours vérifier auprès de la bibliothèque que vous utilisez si elle prend en charge l'utilisation de manière non bloquante .
Mais si vous voulez une solution plus générique, ou s'il n'y a pas d'autre moyen, vous pouvez exécuter tout ce qui bloque dans un processus séparé en utilisant le
multprocessing
module inclus dans python. Le calcul se poursuivra:Cela a pour frais généraux de lancer un nouveau processus et est parfois plus difficile à déboguer sur des scénarios complexes, donc je préfère l'autre solution (en utilisant
matplotlib
les appels d'API non bloquants de )la source
if __name__ == '__main__':
?Essayer
La
show()
documentation dit:la source
IMPORTANT : Juste pour clarifier quelque chose. Je suppose que les commandes sont à l'intérieur d'un
.py
script et le script est appelé en utilisant par exemple àpython script.py
partir de la console.Un moyen simple qui fonctionne pour moi est:
Exemple de
script.py
fichier:la source
Vous voudrez peut-être lire ce document dans
matplotlib
la documentation de, intitulée:Utilisation de matplotlib dans un shell python
la source
Dans mon cas, je voulais que plusieurs fenêtres s'affichent pendant leur calcul. Pour référence, voici la voie:
PS. Un guide très utile pour l'interface OO de matplotlib .
la source
Eh bien, j'ai eu beaucoup de mal à comprendre les commandes non bloquantes ... Mais finalement, j'ai réussi à retravailler l'exemple " Cookbook / Matplotlib / Animations - Animation des éléments de tracé sélectionnés ", donc cela fonctionne avec les threads ( et transmet les données entre les threads soit via des variables globales ou via un multiprocessus
Pipe
) sur Python 2.6.5 sur Ubuntu 10.04.Le script peut être trouvé ici: Animating_selected_plot_elements-thread.py - sinon collé ci-dessous ( avec moins de commentaires ) pour référence:
J'espère que cela aide quelqu'un,
Cheers!
la source
Dans de nombreux cas, il est plus pratique d'enregistrer l'image sous forme de fichier .png sur le disque dur. Voici pourquoi:
Avantages:
Inconvénient:
la source
Si vous travaillez dans la console, c'est-
IPython
à- dire que vous pouvez utiliserplt.show(block=False)
comme indiqué dans les autres réponses. Mais si vous êtes paresseux, vous pouvez simplement taper:Ce sera la même chose.
la source
J'ai également dû ajouter
plt.pause(0.001)
à mon code pour le faire vraiment fonctionner dans une boucle for (sinon il ne montrerait que le premier et le dernier tracé):la source
Sur mon système, show () ne bloque pas, même si je voulais que le script attende que l'utilisateur interagisse avec le graphique (et recueille des données à l'aide des rappels 'pick_event') avant de continuer.
Afin de bloquer l'exécution jusqu'à la fermeture de la fenêtre de traçage, j'ai utilisé ce qui suit:
Notez cependant que canvas.start_event_loop_default () a généré l'avertissement suivant:
bien que le script soit toujours exécuté.
la source
Je voulais également que mes tracés s'affichent, exécutent le reste du code (puis continuent à s'afficher) même s'il y a une erreur (j'utilise parfois des tracés pour le débogage). J'ai codé ce petit hack pour que tous les complots à l'intérieur de cette
with
déclaration se comportent comme tels.C'est probablement un peu trop non standard et déconseillé pour le code de production. Il y a probablement beaucoup de "gotchas" cachés dans ce code.
Si / quand j'implémente un bon "garder les tracés ouverts (même si une erreur se produit) et permettre à de nouveaux tracés d'être affichés", je voudrais que le script se ferme correctement si aucune interférence utilisateur ne le dit autrement (à des fins d'exécution par lots).
Je peux utiliser quelque chose comme une question de délai d'attente "Fin du script! \ NAppuyez sur p si vous souhaitez suspendre la sortie de traçage (vous disposez de 5 secondes):" sur /programming/26704840/corner -cases-for-my-wait-for-user-input-interruption-implementation .
la source
la source
Le PO pose des questions sur le détachement des
matplotlib
parcelles. La plupart des réponses supposent l'exécution de commandes à partir d'un interpréteur python. Le cas d'utilisation présenté ici est ma préférence pour tester le code dans un terminal (par exemple bash) où unfile.py
est exécuté et vous voulez que le ou les tracés apparaissent mais que le script python se termine et revienne à une invite de commande.Ce fichier autonome permet
multiprocessing
de lancer un processus distinct de traçage des données avecmatplotlib
. Le thread principal se termine en utilisant leos._exit(1)
mentionné dans ce post. Lesos._exit()
forces se retirent mais quittent lematplotlib
processus enfant vivant et réactif jusqu'à la fermeture de la fenêtre de tracé. C'est un processus entièrement distinct.Cette approche est un peu comme une session de développement Matlab avec des fenêtres de figures qui proposent une invite de commande réactive. Avec cette approche, vous avez perdu tout contact avec le processus de la fenêtre de figure, mais c'est correct pour le développement et le débogage. Fermez simplement la fenêtre et continuez à tester.
multiprocessing
est conçu pour l'exécution de code uniquement en python, ce qui le rend peut-être mieux adapté quesubprocess
.multiprocessing
est multi-plateforme donc cela devrait bien fonctionner sous Windows ou Mac avec peu ou pas d'ajustement. Il n'est pas nécessaire de vérifier le système d'exploitation sous-jacent. Cela a été testé sur Linux, Ubuntu 18.04LTS.L'exécution
file.py
fait apparaître une fenêtre de chiffre, puis se__main__
ferme, mais la fenêtre de chiffremultiprocessing
+matplotlib
reste sensible au zoom, au panoramique et à d'autres boutons car c'est un processus indépendant.Vérifiez les processus à l'invite de commande bash avec:
ps ax|grep -v grep |grep file.py
la source
.daemon=False
comme décrit ici stackoverflow.com/a/49607287/1476932 Cependant,sys.exit()
je n'ai pas terminé le processus parent comme décrit ici jusqu'à ce que je ferme la fenêtre enfant. D'un autre côté, l'utilisationos._exit(0)
de l'exemple ci-dessus a fonctionné.À mon avis, les réponses dans ce fil fournissent des méthodes qui ne fonctionnent pas pour tous les systèmes et dans des situations plus complexes comme les animations. Je suggère de jeter un œil à la réponse de MiKTeX dans le fil suivant, où une méthode robuste a été trouvée: Comment attendre la fin de l'animation matplotlib?
la source
Si vous voulez ouvrir plusieurs figures, tout en les gardant toutes ouvertes, ce code a fonctionné pour moi:
la source
Sans répondre directement à la demande des PO, je publie cette solution de contournement car cela peut aider quelqu'un dans cette situation:
pour cet Im en utilisant:
Où "var" identifie l'intrigue dans la boucle afin qu'elle ne soit pas écrasée.
la source
Utilisez
plt.show(block=False)
, et à la fin de votre appel de scriptplt.show()
.Cela garantira que la fenêtre ne sera pas fermée lorsque le script sera terminé.
la source