Gaming Life

一日24時間、ゲームは10時間

Pythonで二次元ランダムウォーク+matplotlib.animationのgif保存

 大学の講義にてPythonランダムウォークを実装するのに初歩的なところでハマったのでメモ。プログラムは以下の通り。

%matplotlib nbagg

# -*- coding: utf-8 -*-

# モジュールのインポート
import random
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# メイン実行部
# 試行回数nの初期化
n = int(input("試行回数nを入力してください:"))

fig = plt.figure()
ims = []

x = 0.0
y = 0.0
# グラフ描画の準備
xlist = [x]  # x座標
ylist = [y]  # y座標
# ランダムウォーク
for i in range(n):
    x += (random.random() - 0.5) * 2
    y += (random.random() - 0.5) * 2
    xlist.append(x)
    ylist.append(y)
    im = plt.plot(xlist, ylist, marker='o', color = 'r')
    #im = plt.scatter(xlist, ylist, marker='o', color = 'r'
    ims.append(im)
# グラフの表示

ani = animation.ArtistAnimation(fig,ims,interval=100)
ani.save('test1.gif', writer='imagemagick')
plt.show()

f:id:ai_gaminglife:20180629172519g:plain

 引っかかったのは

im = plt.plot(xlist, ylist, marker='o', color = 'r')
#im = plt.scatter(xlist, ylist, marker='o', color = 'r'
ims.append(im)

のところ。今回はplotでアニメーションさせろって条件だったのでこれで上手くいくのだが、matplotlib.scatterでアニメーションさせる時は

ims.append([im])

と明示的にimをリストに変えなければならない模様。逆にplotの時にimをリストとしてappendすると上手く行かない。これはmatplotlib.plotの返り値が最初からリストになっているせい。

おまけ: Win10 × Jupyter Notebookでmatplotlib.animationの結果をgif保存する方法

 おそらく何も設定を変更せずani.save()しても MovieWriter imagemagick unavailable. などと表示され失敗すると思う。これは下記のサイトの指示に従って設定ファイルを変更すれば解決するはず。しかし、ウチの環境では Install-Package imagemagick が上手く動かなかったので こちらのサイト から直接インストーラーをDLした。

cartman0.hatenablog.com