2017-03-02 14 views
0

私はシミュレーションが進むにつれてプロットされるデータが更新されるような、プロットをPythonで作成しようとしています。 MATLABで、私は次のコードでこれを行うことができます:私はクラス内でこれを行うにはanimationモジュールにmatplotlibFuncAnimation機能を使用しようとしているPythonの動的プロット

t = linspace(0, 1, 100); 
figure 
for i = 1:100 
x = cos(2*pi*i*t); 
plot(x) 
drawnow 
end 

。それは私のシミュレーションで各タイムステップ後に電圧を再計算する関数plot_voltageを呼び出します。

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

def __init__(self): 
    ani = animation.FuncAnimation(plt.figure(2), self.plot_voltage) 
    plt.draw() 

def plot_voltage(self, *args): 
    voltages = np.zeros(100) 
    voltages[:] = np.nan 

    # some code to calculate voltage 

    ax1 = plt.figure(2).gca() 
    ax1.clear() 
    ax1.plot(np.arange(0, len(voltages), 1), voltages, 'ko-')` 

私のシミュレーションを実行すると、数値が表示されますが、ただ凍っています。しかし、コードはエラーなく実行されます。誰かが私に行方不明を知らせてもらえますか?ここで

+0

私は、[この回答](http://stackoverflow.com/questions/28074461/animating-growingに3番目のバージョンを適応させるだろう-line-plot-in-python-matplotlib?rq = 1)を実行します。 – cphlewis

+0

ありがとう、@cphlewis。その解決策の問題は、私が別の関数を持っていれば、単純に正の整数を数える 'count()'と言って、 'plt.show()'の後にこれを実行すると 'count()'は私はプロットを閉じる。 'plt.show()'を 'plt.draw()'に置き換えると、プロットがまったく表示されなくなりますが、 'count()'が実行されます。プログラムが続けて 'count()'が動いている間にプロットを更新するには?バックエンドはQt5Aggで、インタラクティブモードをオンにしています。 –

+0

3番目の解決策では、 'update()'は 'count()'を両方呼び出すので、プロットは続行されます。 – cphlewis

答えて

1

FuncAnimationを使用してmatplotlibのにMATLABコードの翻訳です:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

t = np.linspace(0, 1, 100) 
fig = plt.figure() 
line, = plt.plot([],[]) 

def update(i): 
    x = np.cos(2*np.pi*i*t) 
    line.set_data(t,x) 

ani = animation.FuncAnimation(fig, update, 
       frames=np.linspace(1,100,100), interval=100) 
plt.xlim(0,1) 
plt.ylim(-1,1) 
plt.show() 
+0

ありがとうございます、しかしあなたの上記のコメントは正しいです - 私ははっきりしていたはずです。私はオブジェクトのパラメータが更新されているシミュレーションを持っています。更新が実行されるたびに、私はそれらの値をプロットしたい。 [こちら](https://gist.github.com/anonymous/e5a073a08286397368804526dcafe95e)は最小の例です。必ずしも 'animation'パッケージを使う必要はありません。それは私が試していたものです。この例を実行すると、数値がレンダリングされず、ウィンドウが応答しません。ターミナルをCtrl + Cキーを押すと、数字がプロットされますが、プログラムは停止します。これを行う最善の方法に関する考えはありますか? –

+0

私は[GiHubGistのコード](https://gist.github.com/anonymous/e5a073a08286397368804526dcafe95e?signup=true)にコメントしました。 – ImportanceOfBeingErnest

関連する問題