大学の講義にて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()
引っかかったのは
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した。