24

これは、この質問から適応した、私が求めているもののMWEです:

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

私が望むのは: 関数を呼び出してプロットを作成すると、プロット ウィンドウが表示され、プロンプトに戻って (表示されたばかりの画像に基づいて) 値を入力し、コードを続行できます。 (ウィンドウは閉じてもそのままでもかまいませんが、気にしません)。

代わりに得られるのは、コードが完了したにのみプロットを含むウィンドウが表示されるということです。これは良くありません。


1を追加

私は同じ結果で次のことを試しました.プロットウィンドウはコードの前ではなく最後に表示されます:

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')

draw()に変更しても同じことが起こりshow()ます。


2を追加

私は次のアプローチを試しました:

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

次のメッセージでPython kernel has crashedエラーが発生します。Canopy

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.

に基づいて実行Canopyしていることに言及する必要があります。elementary OSUbuntu 12.04


3を追加

この質問に投稿された解決策も試しました:

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.")

これにより、コードが進むにつれて (つまり、ユーザーが [Enter] を押すと) 空のプロット ウィンドウが表示され、コードが終了した後にのみ画像が表示されます。

このソリューション(これも同じ質問)では、プロット ウィンドウも表示されません。

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.
4

3 に答える 3

28

を使用するplt.show(block=False)と、ブロッキングを直接取り除くことができます。

あなたの例では、これは読むことができます

from matplotlib.pyplot import plot, show

def make_plot():
    plot([1,2,3])
    show(block=False)
    print('continue computation')

print('Do something before plotting.')
# Now display plot in a window
make_plot()

answer = input('Back to main and window visible? ')
if answer == 'y':
    print('Excellent')
else:
    print('Nope')
于 2013-06-17T14:24:24.997 に答える
1

これを動作させることはできませんでしたが(少なくともまだ)、 IDECanopyを使用したいと思っていたようにコードを実行することはできました。Geanyこれは私にとってはうまくいくコードです。これは、コマンドがファイルの末尾からコマンドshow()のすぐ下に移動された、問題の最初のコード ブロックに対する非常に小さな変更です。make_plot()

from matplotlib.pyplot import plot, draw, show

def make_plot():
    plot([1,2,3])
    draw()
    print 'Plot displayed, waiting for it to be closed.'

print('Do something before plotting.')
# Now display plot in a window
make_plot()
# This line was moved up <----
show()

answer = raw_input('Back to main after plot window closed? ')
if answer == 'y':
    print('Move on')
else:
    print('Nope')

それは私が望んでいることを正確に行うわけではありませんが、十分に近いものです.ユーザーにプロットを表示し、そのプロットウィンドウが閉じられるまで待ってから、コードに進みます. 理想的には、プロット ウィンドウが閉じられるまで待ってからコードを進めるべきではありませんが、何もないよりはましだと思います。

上記のAdd 2セクションのコードも同じように機能し、 で変更する必要はありませんGeanyが、単純なのでこちらの方が好みです。この回答を更新します(いつ?)これで動作するようになりましたCanopy

于 2013-07-14T15:17:03.097 に答える