Matplotlib - Forcer l'affichage du tracé, puis revenir au code principal
C'est un MWE de ce que je suis après, adapté de cette question:
from matplotlib.pyplot import plot, draw, show
def make_plot():
plot([1,2,3])
draw()
print 'continue computation'
print('Do something before plotting.')
# Now display plot in a window
make_plot()
answer = raw_input('Back to main and window visible? ')
if answer == 'y':
print('Excellent')
else:
print('Nope')
show()
Est ce que je veux: j'appelle la fonction pour faire de la parcelle, la parcelle fenêtre s'affiche, puis-je obtenir pour revenir à l'invite donc, je peux saisir la valeur (basé sur l'image que juste affiché) et de poursuivre avec le code (la fenêtre peut alors fermer ou d'y rester, je n'ai pas de soins).
Ce que je reçois à la place, c'est que la fenêtre avec l'intrigue n'apparaît après le code est terminée, ce qui n'est pas bon.
Ajouter 1
J'ai essayé ce qui suit, avec les mêmes résultats, l'intrigue fenêtre apparaît à la fin du code et pas avant:
from matplotlib.pyplot import plot, ion, draw
ion() # enables interactive mode
plot([1,2,3]) # result shows immediately (implicit draw())
# at the end call show to ensure window won't close.
draw()
answer = raw_input('Back to main and window visible? ')
if answer == 'y':
print('Excellent')
else:
print('Nope')
La même chose se passe si je change draw()
pour show()
.
Ajouter 2
J'ai essayé la méthode suivante:
from multiprocessing import Process
from matplotlib.pyplot import plot, show
def plot_graph(*args):
for data in args:
plot(data)
show()
p = Process(target=plot_graph, args=([1, 2, 3],))
p.start()
print 'computation continues...'
print 'Now lets wait for the graph be closed to continue...:'
p.join()
ce qui résulte en une Python kernel has crashed
erreur dans Canopy
avec le message:
The kernel (user Python environment) has terminated with error code -6. This may be due to a bug in your code or in the kernel itself.
Output captured from the kernel process is shown below.
[IPKernelApp] To connect another client to this kernel, use:
[IPKernelApp] --existing /tmp/tmp9cshhw.json
QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries.
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python: ../../src/xcb_io.c:274: poll_for_event: La declaración `!xcb_xlib_threads_sequence_lost' no se cumple.
Je dois mentionner que je suis en cours d'exécution Canopy
dans elementary OS
qui est basé dans Ubuntu 12.04
.
Ajouter 3
Aussi essayé la solution posté dans cette question:
import numpy
from matplotlib import pyplot as plt
if __name__ == '__main__':
x = [1, 2, 3]
plt.ion() # turn on interactive mode
for loop in range(0,3):
y = numpy.dot(x, loop)
plt.figure()
plt.plot(x,y)
plt.show()
_ = raw_input("Press [enter] to continue.")
Cette affiche vide parcelle de windows, comme le code avances (ie: l'utilisateur appuie sur [enter]) et n'affiche que les images après le code est fini.
Cette solution (également dans la même question) n'a même pas d'afficher le tracé de windows:
import numpy
from matplotlib import pyplot as plt
if __name__ == '__main__':
x = [1, 2, 3]
plt.ion() # turn on interactive mode, non-blocking `show`
for loop in range(0,3):
y = numpy.dot(x, loop)
plt.figure() # create a new figure
plt.plot(x,y) # plot the figure
plt.show() # show the figure, non-blocking
_ = raw_input("Press [enter] to continue.") # wait for input from the user
plt.close() # close the figure to show the next one.
source d'informationauteur Gabriel
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
plt.show(block=False)
qui se débarrasse de la bloquant directement.Pour ton exemple, cela pourrait lire
Aucune des solutions présentées travail pour moi. J'ai testé avec trois différents IDEs PyCharmSpyder et Pyzoà l'aide de l' (actuellement) le dernier Matplotlib 2.1 sous Python 3.6.
Ce qui fonctionne pour moi, bien que n'étant pas optimal, est d'utiliser un
plt.pause
commande:Je ne pouvais pas obtenir que cela fonctionne avec
Canopy
(pas encore du moins) mais j'ai pu obtenir l'exécution de code un peu comme je voulais à l'aide de laGeany
IDE. C'est le code qui fonctionne pour moi, c'est une très légère modification pour le premier bloc de code dans la question " d'où lashow()
de commande est déplacé au-dessus de la fin du fichier, juste en dessous de lamake_plot()
commande:Il ne fait pas exactement ce que je veux, mais c'est assez proche: il montre un complot pour l'utilisateur, attend jusqu'à ce que la fenêtre du tracé est fermé et se déplace ensuite sur le code. Idéalement, il ne devrait pas avoir à attendre jusqu'à ce que le tracé de la fenêtre est fermée à passer avec le code, mais c'est mieux que rien je suppose.
Le code dans le Ajouter 2 section ci-dessus fonctionne également de la même manière et sans modifications nécessaires dans
Geany
mais je préfère celui-ci car c'est plus simple. Je vais mettre à jour cette réponse Si (quand?) Je reçois ce de travailler avecCanopy
.