1

これまでの私のスクリプトは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt
import random
t=0
r=3.0
n=0
A=[]
for x in range(10):
  for y in range(10):
    A.append([random.uniform(0,1),random.uniform(0,1)])
for m in range(len(A)):
  plt.plot(A[m][0],A[m][1], "x", color="blue")
plt.show()
while n<=100:
  for m in range(len(A)):
    A[m][0]=r*A[m][0]*(1-A[m][0])
    A[m][1]=r*A[m][1]*(1-A[m][1])
  for m in range(len(A)):
    plt.plot(A[m][0],A[m][1], "x", color="blue")
  plt.show()
  n+=1

私が今やりたいのは、それをアニメーション化することです。これにより、Python が再計算して次の画像を表示するたびにプロットを閉じる必要がなくなります。代わりに、5 秒ごとに新しいプロットを表示する必要があります。それを行うための最良の方法は何ですか?

4

3 に答える 3

7

matplotlib.animationパッケージを使用できます:

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

t=0
r=3.0
n=0
A=[]

for x in range(10):
    for y in range(10):
        A.append([random.uniform(0,1),random.uniform(0,1)])
A = np.array(A).transpose()

fig = plt.figure()
line, = plt.plot(A[0],A[1], "x", color="blue")

def update():
    for i in range(100):
        A[0], A[1] = r*A[0]*(1-A[0]), r*A[1]*(1-A[1])
        yield A

def draw(data):
    line.set_xdata(data[0])
    line.set_ydata(data[1])
    return line,

ani = animation.FuncAnimation(fig, draw, update, interval=1000, blit=False)

plt.show()

このupdate関数は、後続のステップのデータを生成するジェネレータでありdraw、プロット データを更新して返す関数です。

于 2013-01-16T13:49:34.930 に答える
1

インタラクティブプロットを有効にするために使用plt.ion()し(プロットウィンドウが開いているときに実行を停止しません)、次にplt.clf()プロットをクリアするために使用します。

実用的なサンプルは次のとおりです。

import numpy as np
import matplotlib.pyplot as plt
plt.ion()

import random
t=0
r=3.0
n=0
A=[]
for x in range(10):
    for y in range(10):
        A.append([random.uniform(0,1),random.uniform(0,1)])

for m in range(len(A)):
    plt.plot(A[m][0],A[m][1], "x", color="blue")
    plt.draw()
plt.pause(1)

while n<=100:
    for m in range(len(A)):
        A[m][0]=r*A[m][0]*(1-A[m][0])
        A[m][1]=r*A[m][1]*(1-A[m][1])
    for m in range(len(A)):
        plt.plot(A[m][0],A[m][1], "x", color="blue")
    plt.draw()
    plt.pause(1)
    plt.clf()

plt.draw()GUIを強制的にすぐに更新しplt.pause(t)、t秒間中断するためにを使用する必要があります。実際、スクリプトの2つの部分(plotコマンドを含む2つのループ)をアニメーションの観点からどのように処理するかはよくわかりませんが、私のコードが正しい方法をガイドしてくれることを願っています。

備考

まず、Pythonをコーディングするときは、いくつかの規則に従うことをお勧めします。4スペースのインデントを使用すると、コードがはるかに読みやすくなります。次に、配列にnumpyを使用することをお勧めします。インポートしますが、使用しません。これにより、コードが確実に高速になります。最後に、plot(x,y,"bx")matplotlibの署名を知っていますか?本当に便利だと思います。

于 2013-01-16T13:37:40.660 に答える
0

アーティスト チュートリアルにうまくまとめられている、matplotlib のオブジェクト指向インターフェイスを使用することをお勧めします。

これにより、Figure の動作をより細かく制御し、ループ内でプロットを簡単に再描画できます。

import numpy as np
import matplotlib.pyplot as plt
import random
from time import sleep
t=0
r=3.0
n=0
A=[]
for x in range(10):
    for y in range(10):
        A.append([random.uniform(0,1),random.uniform(0,1)])
fig = plt.figure()
ax = fig.add_subplot(111)
for m in range(len(A)):
    ax.plot(A[m][0],A[m][1], "x", color="blue")
fig.show()
sleep(1)
while n<=100:
    for m in range(len(A)):
        A[m][0]=r*A[m][0]*(1-A[m][0])
        A[m][1]=r*A[m][1]*(1-A[m][1])
    ax.clear()
    for m in range(len(A)):
        ax.plot(A[m][0],A[m][1], "x", color="blue")
    fig.canvas.draw()
    sleep(1)
    n+=1

スクリプトからの主な変更点は、データの変更後に図を使用して更新するfig.showことです。plt.showfig.canvas.draw

于 2013-01-16T13:54:15.593 に答える