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