Start_python’s diary

ふたり暮らし

アラフィフ夫婦のフリーランスプラン

3Dグラフのアニメーションを作成する(Python matplotlibの使い方)

f:id:Start_python:20200115144233g:plain

はじめに

前回に続き、今度は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万回試行してみた結果がこちらです。

f:id:Start_python:20200115150904p:plain

1万回くらいでは収束していないのがわかります。

このやり方で株価やFXなどの予想が可能なのか実験してみましたが、おそらく実用レベルにはならなそうです。(ランダムなサイコロで収束すれば、株価の歪みを調べるのはおもしろそうだったのですが。)