web-dev-qa-db-ja.com

Matplotlib-プロット表示を強制してからメインコードに戻る

これは私が求めているものの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()
_

その結果、Canopyに_Python kernel has crashed_エラーが発生し、次のメッセージが表示されます。

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

_elementary OS_をベースとする_Ubuntu 12.04_でCanopyを実行していることをお伝えしておきます。


追加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.
_
18
Gabriel

ブロッキングを直接取り除く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')
24
David Zwicker

提示された解決策はどれも私にとってはうまくいきません。 3つの異なるIDE PyCharmSpyder および Pyzo を使用して、Python 3.6。

私にとってうまくいくのは、最適ではありませんが、plt.pauseコマンド:

import matplotlib.pyplot as plt

def make_plot():
    plt.plot([1, 2, 3])
#    plt.show(block=False)  # The plot does not appear.
#    plt.draw()             # The plot does not appear.
    plt.pause(0.1)          # The plot properly appears.
    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')
8
divenex

これをCanopyで動作させることはできませんでしたが(少なくとも)、Geany IDEを使用したいようなコードを実行することはできました。これは私のために働くコードです、それは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で動作するようにした場合。

1
Gabriel