3Dグラフのアニメーションを作成する(Python matplotlibの使い方)
はじめに
前回に続き、今度はmatplotlibモジュールを使って三次元グラフを作ってみます。
「from mpl_toolkits.mplot3d import Axes3D」を使用します。
サイコロの出た目を、前回の目をx軸、前々回の目をy軸にしたとき、z軸に偶数なら青色で奇数なら赤色で出た目の合計回数グラフで表します。
プログラムのコード
import random import numpy as np import matplotlib.pylab as plt import matplotlib.animation as animation from mpl_toolkits.mplot3d import Axes3D # Qテーブルの初期化 q_table_1 = np.zeros((6, 6)) q_table_2 = np.zeros((6, 6)) # 3Dグラフの準備 fig = plt.figure() x = [1, 2, 3, 4, 5, 6] y = [1, 2, 3, 4, 5, 6] X, Y = np.meshgrid(x, y) a1 = random.randint(0, 5) a0 = random.randint(0, 5) def update(i): global a0, a1, a2 plt.cla() a2 = a1 a1 = a0 a0 = random.randint(0, 5) if a0 == 1 or a0 == 3 or a0 == 5: q_table_1[a1, a2] += 1 if a0 == 0 or a0 == 2 or a0 == 4: q_table_2[a1, a2] += 1 Z1 = q_table_1 Z2 = q_table_2 ax = Axes3D(fig) plt.title('i=' + str(i) + ' [ ' + str(a0+1) + ' ]') ax.plot_wireframe(X, Y, Z1, color='b') ax.plot_wireframe(X, Y, Z2, color='r') ani = animation.FuncAnimation(fig, update, interval = 100) plt.show()
解説
y軸用に6×6のQテーブルを2つ作ります。出た目「a0+1」が偶数のときはQテーブル1に、奇数のときはQテーブル2の前回x軸と前々回y軸の位置を+1します。
fig = plt.figure()
ax = Axes3D(fig)
で3次元グラフの準備をします。
ax.plot_wireframe(X, Y, Z)
ワイヤーフレーム表示で3Dグラフを作成します。X、Y、Zはすべて二次元配列です。
ani = animation.FuncAnimation(fig, update, interval = 100)
update関数「def update(i):」を100ミリ秒毎に呼び出して実行します。棒グラフのアニメーションのときと同じです。
まとめ
3次元グラフのアニメーションはすごく重いです。50回超えたあたりから動きが鈍くなります。アニメーションなしで1万回試行してみた結果がこちらです。
1万回くらいでは収束していないのがわかります。
このやり方で株価やFXなどの予想が可能なのか実験してみましたが、おそらく実用レベルにはならなそうです。(ランダムなサイコロで収束すれば、株価の歪みを調べるのはおもしろそうだったのですが。)