酒飲みによる機械学習日記

〜ただの酒好きが、なんとなく流行っている機械学習について語っていきます、たまに金融ネタも〜

Pythonでアニメーション3 〜3D〜

今までにsin波のプロットアニメーションや、sin波とcos波の同時プロットアニメーションを作成した。

今回は3D版でもアニメーションに挑戦!!今回も簡単にできました!

x軸方向はアニメーションの関数の引数frameで、y軸方向はsin(x)、z軸方向はcos(x)としています。なので、x軸方向に円が進んでいくイメージです。

f:id:nts-524:20181009065914g:plain nts-524.hatenablog.jp nts-524.hatenablog.jp

参考文献

以下の記事を参考にさせていただきました!ありがとうございます🙇‍♂️

ソースコード全文

# =-=-=-=-=-=-=-=-=-=-=-=- module -=-=-=-=-=-=-=-=-=-=-=-= #
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import math, os, argparse

sns.set_style('whitegrid')

# =-=-=-=-=-=-=-=-=-=-=-=- main -=-=-=-=-=-=-=-=-=-=-=-= #
def main():
    # argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--result', type=str, default='result/anime3.gif')
    args = parser.parse_args()

    # make result directory
    if not os.path.exists('result/'):
        os.makedirs('result/')

    # define plot function
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    x = []
    y = []
    z = []
    def plot(frame):
        """update function for graph"""
        # clean graph
        plt.cla()
        # add data
        x.append(frame)
        y.append(math.sin(frame))
        z.append(math.cos(frame))
        # replot
        ax.scatter(x, y, z)
        ax.set_xlim(0, 10)
        ax.set_ylim(-1, 1)
        ax.set_zlim(-1, 1)
        ax.set_xlabel('x')
        ax.set_ylabel('y')
        ax.set_zlabel('z')


    # visualize result
    anime = animation.FuncAnimation(
        fig, plot,
        interval=10, # [ms]
        frames=np.arange(0, 10, 0.1),
        repeat=False,
    )
    anime.save(args.result, writer='pillow')
    plt.show()

if __name__ == '__main__':
    main()