web-dev-qa-db-ja.com

matplotlib.pyplot / pylabは、ipython -pylabを使用して、isinteractive()中に図を更新しません

Matplotlib、pylab、pyplot、ipythonについてはたくさんの質問がありますので、これを見るのにうんざりしている場合は申し訳ありません。私は人々の質問を調べ、pyplotとpylabのドキュメントを調べてきましたが、何が間違っているのかまだわからないので、できるだけ具体的にしようと思います。コードについて:

目標:0.5秒ごとに図をプロットし、plotコマンドが呼び出されるとすぐに図を更新します。

これをコーディングする私の試みは次のとおりです(ipython -pylabで実行):

 _
import time
ion()
x=linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    #see **
    print i
    time.sleep(1)
print 'Done'
_ 

各行を正しくプロットしますが、forループを終了するまではプロットしません。 draw()を_**_の場所に配置して強制的に再描画しようとしましたが、それも機能していないようです。理想的には、完全に再描画するのではなく、単に各行を追加するようにしたいです。ただし、再描画が必要な場合は問題ありません。

解決の追加の試み:
ion()の直後に、hold(True)を追加しようとしましたが役に立ちませんでした。
キックの場合はshow() for _**_
私がやろうとしていることに最も近い答えは 実行をブロックせずに行をプロットする でしたが、show()は何もしていません。

これが単純な要求である場合はお詫び申し上げます。私は非常に明白なことを過去に見ています。これは、matlabコードをクラスからいくつかのpython)に変換しようとしたときに発生しました。変換しようとしていた元のmatlab(初期化は削除されました)は次のとおりです。 :

_
for i=1:time
    plot(u)
    hold on
    pause(.01)
    for j=2:n-1
        v(j)=u(j)-2*u(j-1)
    end
    v(1)= pi
    u=v
end
_

「this_methodを検索する」だけでも、どんな助けでも素晴らしいので、少なくともそのメソッドの使い方を理解するための努力を絞り込むことができます。役立つ情報が他にある場合は、お知らせください。

16
user312364

リンクした質問に対する2番目の回答は、次のような回答を提供します。draw()ごとにplot()を呼び出して、すぐに表示されるようにします。例えば:

_import time
ion()
x = linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    # make it appear immediately
    draw()
    time.sleep(1)
_

それがうまくいかない場合は...このページで彼らがしていることを試してください: http://www.scipy.org/Cookbook/Matplotlib/Animations

_import time

ion()

tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas

print 'FPS:' , 200/(time.time()-tstart)
_

このページには、line.set_ydata()関数が重要な部分であると記載されています。

9
Daniel G
from pylab import *
import time
ion()
tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas
    pause(0.01)
print 'FPS:' , 200/(time.time()-tstart)
ioff()
show()

上記は私にとってうまくいきました。私はwin7OSの下でpythonxy2.7.3のspyderエディターでそれを実行しました。 draw()の後にioff()とshow()が続くpause()ステートメントに注意してください。

10

macで実行されているipythonでもまったく同じ問題が発生しました。 (ユキヒョウを実行しているMacbookproでpython 2.7 32ビットの分布を考えた)。

職場の友人からヒントを得ました。次の引数を使用して、ターミナルからipythonを実行します。

「ipython-wthread-pylab」

これは私のために働きます。上記のpython "Daniel G"のコードは問題なく実行されますが、以前はプロットが更新されませんでした。

Ipythonのドキュメントによると: "[-gthread、-qthread、-q4thread、-wthread、-pylab:...] GTK、Qt(バージョン3および4)、WXPythonツールキット、およびmatplotlibのスレッドサポートを提供します。図書館。"なぜそれが重要なのかわかりませんが、機能します。

それがお役に立てば幸いです、labjunky

5
labjunky

answer 同様の質問にここに投稿したのをご覧ください。 GTKAggバックエンドのみを使用して問題なくアニメーションを生成できました。これを行うには、次の行をスクリプトに追加する必要があります(pylabをインポートする前だと思います)。

matplotlib.use('GTkAgg')

また、PyGTKをインストールします。

0
Carlos Cordoba