283

Pythonインタープリターでこれらの指示を行うと、プロットのあるウィンドウが表示されます。

from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code

show()残念ながら、プログラムがさらに計算を行っている間に作成された図をインタラクティブに探索し続ける方法がわかりません。

それは可能ですか?計算が長い場合があり、中間結果の検討中に計算を進めると役立ちます。

4

21 に答える 21

243

matplotlibブロックしない の呼び出しを使用します。

使用draw():

from matplotlib.pyplot import plot, draw, show
plot([1,2,3])
draw()
print('continue computation')

# at the end call show to ensure window won't close.
show()

対話モードの使用:

from matplotlib.pyplot import plot, ion, show
ion() # enables interactive mode
plot([1,2,3]) # result shows immediatelly (implicit draw())

print('continue computation')

# at the end call show to ensure window won't close.
show()
于 2009-01-19T16:52:17.983 に答える
153

ブロック動作をオーバーライドするには、キーワード「block」を使用します。

from matplotlib.pyplot import show, plot

plot(1)  
show(block=False)

# your code

コードを続行します。

于 2012-11-13T13:40:54.717 に答える
32

使用しているライブラリが非ブロッキング方式での使用をサポートしているかどうかを常に確認することをお勧めします。

ただし、より一般的なソリューションが必要な場合、または他に方法がない場合はmultprocessing、Pythonに含まれているモジュールを使用して、別のプロセスでブロックするものをすべて実行できます。計算は続行されます:

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 'yay'
print 'computation continues...'
print 'that rocks.'

print 'Now lets wait for the graph be closed to continue...:'
p.join()

これには、新しいプロセスを起動するオーバーヘッドがあり、複雑なシナリオではデバッグが難しい場合があるため、他のソリューションをお勧めします(matplotlibノンブロッキングAPI呼び出しを使用)

于 2009-01-19T16:40:24.983 に答える
26

試す

import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show(block=False)
# other code
# [...]

# Put
plt.show()
# at the very end of your script to make sure Python doesn't bail out
# before you finished examining.

show()ドキュメントには次のように記載されています。

非対話モードでは、すべての図を表示し、図が閉じられるまでブロックします。対話モードでは、非対話モードから対話モードに変更する前に Figure が作成されていない限り、効果はありません (推奨されません)。その場合、図は表示されますが、ブロックされません。

1 つの実験的なキーワード引数 block を True または False に設定して、上記のブロック動作を無効にすることができます。

于 2013-01-18T11:53:33.170 に答える
10

matplotlib次のタイトルののドキュメントでこのドキュメントを読むことをお勧めします。

Pythonシェルでのmatplotlibの使用

于 2009-01-19T17:00:04.630 に答える
8

私の場合、計算中にいくつかのウィンドウがポップアップするようにしたかったのです。参考までに、こんな方法です。

from matplotlib.pyplot import draw, figure, show
f1, f2 = figure(), figure()
af1 = f1.add_subplot(111)
af2 = f2.add_subplot(111)
af1.plot([1,2,3])
af2.plot([6,5,4])
draw() 
print 'continuing computation'
show()

PS。matplotlib の OO インターフェイスの非常に役立つガイドです。

于 2009-01-21T14:05:30.923 に答える
6

さて、ノンブロッキング コマンドを理解するのに非常に苦労しました...しかし、最終的に、「Cookbook/Matplotlib/Animations - Animating selected plot elements」の例をなんとかやり直すことができたので、スレッドで動作します (そして、スレッド間でデータを渡しますPipe。 Ubuntu 10.04 の Python 2.6.5 では、グローバル変数を介して、またはマルチプロセスを介して)。

スクリプトは次の場所にあります: Animating_selected_plot_elements-thread.py - それ以外の場合は、参照用に以下に貼り付けます (コメントを少なくします):

import sys
import gtk, gobject
import matplotlib
matplotlib.use('GTKAgg')
import pylab as p
import numpy as nx 
import time

import threading 



ax = p.subplot(111)
canvas = ax.figure.canvas

# for profiling
tstart = time.time()

# create the initial line
x = nx.arange(0,2*nx.pi,0.01)
line, = ax.plot(x, nx.sin(x), animated=True)

# save the clean slate background -- everything but the animated line
# is drawn and saved in the pixel buffer background
background = canvas.copy_from_bbox(ax.bbox)


# just a plain global var to pass data (from main, to plot update thread)
global mypass

# http://docs.python.org/library/multiprocessing.html#pipes-and-queues
from multiprocessing import Pipe
global pipe1main, pipe1upd
pipe1main, pipe1upd = Pipe()


# the kind of processing we might want to do in a main() function,
# will now be done in a "main thread" - so it can run in
# parallel with gobject.idle_add(update_line)
def threadMainTest():
    global mypass
    global runthread
    global pipe1main

    print "tt"

    interncount = 1

    while runthread: 
        mypass += 1
        if mypass > 100: # start "speeding up" animation, only after 100 counts have passed
            interncount *= 1.03
        pipe1main.send(interncount)
        time.sleep(0.01)
    return


# main plot / GUI update
def update_line(*args):
    global mypass
    global t0
    global runthread
    global pipe1upd

    if not runthread:
        return False 

    if pipe1upd.poll(): # check first if there is anything to receive
        myinterncount = pipe1upd.recv()

    update_line.cnt = mypass

    # restore the clean slate background
    canvas.restore_region(background)
    # update the data
    line.set_ydata(nx.sin(x+(update_line.cnt+myinterncount)/10.0))
    # just draw the animated artist
    ax.draw_artist(line)
    # just redraw the axes rectangle
    canvas.blit(ax.bbox)

    if update_line.cnt>=500:
        # print the timing info and quit
        print 'FPS:' , update_line.cnt/(time.time()-tstart)

        runthread=0
        t0.join(1)   
        print "exiting"
        sys.exit(0)

    return True



global runthread

update_line.cnt = 0
mypass = 0

runthread=1

gobject.idle_add(update_line)

global t0
t0 = threading.Thread(target=threadMainTest)
t0.start() 

# start the graphics update thread
p.show()

print "out" # will never print - show() blocks indefinitely! 

これが誰かに役立つことを願っています、
乾杯!

于 2010-11-10T21:55:48.713 に答える
5

多くの場合、イメージを .png ファイルとしてハード ドライブに保存する方が便利です。理由は次のとおりです。

利点:

  • プロセスの途中でいつでも開いて、見て、閉じることができます。これは、アプリケーションが長時間実行されている場合に特に便利です。
  • 何もポップアップせず、ウィンドウを開く必要はありません。これは、多くの図を扱う場合に特に便利です。
  • イメージは後で参照するためにアクセスでき、Figure ウィンドウを閉じても失われません。

欠点:

  • 私が考えることができる唯一のことは、自分でフォルダを見つけて画像を開く必要があるということです.
于 2013-12-18T18:21:54.910 に答える
5

また、for ループ内で実際に動作するようにコードを追加plt.pause(0.001)する必要がありました (そうしないと、最初と最後のプロットのみが表示されます)。

import matplotlib.pyplot as plt

plt.scatter([0], [1])
plt.draw()
plt.show(block=False)

for i in range(10):
    plt.scatter([i], [i+1])
    plt.draw()
    plt.pause(0.001)
于 2016-11-09T14:16:16.620 に答える
5

コンソールで作業している場合、つまり、他の回答で指摘されているようにIPython使用できます。plt.show(block=False)しかし、あなたが怠け者なら、次のようにタイプすることができます:

plt.show(0)

これは同じです。

于 2016-01-18T11:11:44.670 に答える
4

私のシステムでは、show() はブロックされませんが、続行する前に、ユーザーがグラフを操作する (そして「pick_event」コールバックを使用してデータを収集する) までスクリプトを待機させたいと考えていました。

プロット ウィンドウが閉じられるまで実行をブロックするために、次を使用しました。

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(x,y)

# set processing to continue when window closed
def onclose(event):
    fig.canvas.stop_event_loop()
fig.canvas.mpl_connect('close_event', onclose)

fig.show() # this call does not block on my system
fig.canvas.start_event_loop_default() # block here until window closed

# continue with further processing, perhaps using result from callbacks

ただし、 canvas.start_event_loop_default() が次の警告を生成したことに注意してください。

C:\Python26\lib\site-packages\matplotlib\backend_bases.py:2051: DeprecationWarning: Using default event loop until function specific to this GUI is implemented
  warnings.warn(str,DeprecationWarning)

スクリプトはまだ実行されていますが。

于 2011-03-17T05:06:56.213 に答える
0

複数の図を開きたい場合、それらをすべて開いたままにしておくと、次のコードが機能しました。

show(block=False)
draw()
于 2016-09-16T15:11:08.363 に答える