pyplot の描画をアニメーションをさせるには matplotlib.animation の ArtistAnimation が便利ですね。
ただ、線分を使ったアニメを作ろうとしたら少々戸惑いましたのでご参考まで。
通常、アニメはこんな要領かと思います。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
x = np.arange(0, np.pi * 2, np.pi / 10.0)
y = np.sin(x)
fig = plt.figure()
imgs = []
for i in range(len(x)):
img = plt.plot(x[:i+1], y[:i+1], 'b-o')
imgs.append(img)
anim = animation.ArtistAnimation(fig, imgs, interval=100)
anim.save('result1.gif', 'imagemagick')
plt.show()
また、線分を書くのはこのように、線分を個別に配列にして plot すると簡単です。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
step = np.pi / 10.0
xs = np.arange(0, np.pi * 2, step)
for x in xs:
y = np.sin(x)
plt.plot([x, x + step], [y, y], 'b-o')
plt.savefig('result2.png')
plt.show()
さてこれをアニメーションさせたいのですが、この plot のたびに append したのでは変なアニメになってしまいます。
まあこれはあたりまえの話でありまして、希望としては複数の plot をまとめて1フレームとして追加したいわけです。
しかし、下記では失敗します。
for i in range(len(xs)):
lines = []
for x in xs[0:i+1]:
y = np.sin(x)
img = plt.plot([x, x + step], [y, y], 'b-o')
lines.append(img)
imgs.append(lines)
:
AttributeError: 'list' object has no attribute 'set_visible'
まあそうだよなあ、乱暴だったよなあ。(ああ、python に時間取られるのいやだなあ…)
しかし答えはアハ的なもので、append ではなく extend にすれば通ります。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
step = np.pi / 10.0
xs = np.arange(0, np.pi * 2, step)
fig = plt.figure()
imgs = []
for i in range(len(xs)):
lines = []
for x in xs[0:i+1]:
y = np.sin(x)
img = plt.plot([x, x + step], [y, y], 'b-o')
lines.extend(img)
imgs.append(lines)
anim = animation.ArtistAnimation(fig, imgs, interval=100)
anim.save('result4.gif', 'imagemagick')
plt.show()
要するに plot の戻りってリストなんですね([Line2D])。
以上です。おそまつさまでした。
この記事の環境
- Python 3.5.1 :: Anaconda 2.5.0 (x86_64)