初心者でもOK!Pythonで楽々アニメーション作成の12ステップ

Pythonとmatplotlibを使ったアニメーション作成のステップバイステップガイドPython
この記事は約16分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonという言語を使って、簡単にアニメーションを作りたいと思ったことはありませんか?

この記事では、Pythonとmatplotlibを使ったアニメーションの作成方法について、初心者向けに分かりやすく説明します。

これから紹介する12のステップを順に進めていくことで、あなたもPythonで楽々とアニメーションを作ることができるようになります。

●Pythonとmatplotlibについて

○Pythonとは

Pythonは、1991年にギード・ヴァンロッサムによって開発された汎用プログラミング言語です。

読みやすさが特徴であり、そのシンプルな文法は初心者が学ぶにも適しています。

また、Pythonはオープンソースであり、誰でも自由に使用、改変、再配布が可能です。

○matplotlibとは

matplotlibは、Pythonのデータ可視化ライブラリの一つです。

静的なグラフだけでなく、動的なアニメーションも簡単に作成することができます。

さまざまな種類のグラフを作成できるので、データの解析やプレゼンテーションなど、様々なシーンで利用されています。

●Pythonとmatplotlibのインストール方法

Pythonとmatplotlibのインストールは非常に簡単です。

Pythonの公式ウェブサイトからダウンロードしてインストールします。

その後、Pythonのパッケージ管理ツールであるpipを使ってmatplotlibをインストールします。

下記のコマンドをターミナルに打ち込むことで、matplotlibがインストールできます。

pip install matplotlib

このコマンドを実行すると、最新のmatplotlibがインストールされます。

●Pythonとmatplotlibの基本的な使い方

○Pythonの基本操作

Pythonの基本的な操作として、まずは簡単な計算から始めてみましょう。

例えば、次のコードは2つの数値を足し合わせる簡単なコードです。

print(2 + 3)

このコードを実行すると、結果として5が表示されます。

これは、2と3を足した結果を表示するという動作を示しています。

○matplotlibの基本操作

matplotlibでグラフを作成する基本的な手順は次の通りです。

まず、matplotlib.pyplotをインポートします。

これは一般的に「plt」という名前でインポートされます。

次に、データを定義します。

ここでは例として、0から10までの整数をx軸の値とし、それぞれの二乗をy軸の値とします。

import matplotlib.pyplot as plt

x = list(range(11))
y = [num ** 2 for num in x]

plt.plot(x, y)
plt.show()

このコードを実行すると、x軸に0から10までの数値、y軸にそれぞれの二乗値をプロットしたグラフが表示されます。

これらは非常に基本的な部分であり、Pythonやmatplotlibの豊かな機能を活用するためにはさらに学習を深めていく必要があります。

これだけの知識でもすでにアニメーションを作成するための基礎知識は身につけたと言えるでしょう。

●アニメーションの作り方

matplotlibの力を借りて、Pythonでアニメーションを作成する方法について学んでいきましょう。

○サンプルコード1:基本的なアニメーションの作り方

まずは、基本的なアニメーションの作り方から始めましょう。

この例では、線が画面を右から左へと移動するシンプルなアニメーションを作成します。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x + i / 50.0))  
    return line,

ani = animation.FuncAnimation(fig, animate, frames=100, interval=100, blit=True)

plt.show()

このコードでは、animation.FuncAnimationを使ってアニメーションを作成しています。

この関数は、matplotlibのアニメーション機能の中核を担っており、基本的な動きを設定するために使います。

framesパラメータはアニメーションのフレーム数を設定し、intervalパラメータはフレーム間の時間(ミリ秒)を設定します。

この例では、100フレームのアニメーションを、1フレームあたり100ミリ秒で表示します。

○サンプルコード2:アニメーションにデータを適用する

次に、具体的なデータをアニメーションに適用する方法を見てみましょう。

この例では、正規分布に従うランダムなデータを生成し、そのヒストグラムをアニメーションで表示します。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

n = 100
x = np.random.randn(n)

def update(curr):
    if curr == n:
        a.event_source.stop()
    plt.cla()
    bins = np.arange(-4, 4, 0.5)
    plt.hist(x[:curr], bins=bins)
    plt.title('Sampling the Normal Distribution')
    plt.ylabel('Frequency')
    plt.xlabel('Value')

a = animation.FuncAnimation(fig, update, interval=100)
plt.show()

このコードでは、animation.FuncAnimation関数にupdate関数を渡して、フレームごとにヒストグラムを更新しています。

これにより、データが徐々にサンプリングされる様子を視覚的に表現することができます。

○サンプルコード3:アニメーションに複数のデータを適用する

複数のデータを一つのアニメーションに適用することも可能です。

この例では、二つのサイン波形を一つのアニメーションで表示します。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line1, = ax.plot(x, np.sin(x))
line2, = ax.plot(x, np.sin(x + np.pi / 2))

def animate(i):
    line1.set_ydata(np.sin(x + i / 50.0))
    line2.set_ydata(np.sin(x + np.pi / 2 + i / 50.0))
    return line1, line2

ani = animation.FuncAnimation(fig, animate, frames=100, interval=100, blit=True)

plt.show()

このコードでは、二つのサイン波形(line1line2)を作成し、それぞれをanimate関数で更新しています。

これにより、異なる位相を持つ二つの波形が同時にアニメーションで表示されます。

○サンプルコード4:アニメーションの表示時間を調整する

アニメーションの表示時間は、intervalパラメータを調整することで自由に変更できます。

この例では、サイン波形のアニメーションを作成し、その表示時間を調整します。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x + i / 50.0))  
    return line,

# intervalを200に設定
ani = animation.FuncAnimation(fig, animate, frames=100, interval=200, blit=True)

plt.show()

このコードでは、intervalパラメータを200に設定して、前の例よりもアニメーションの速度を遅くしています。

つまり、一つのフレームが表示される時間が長くなります。

●アニメーションの応用例

Pythonとmatplotlibを駆使すれば、さまざまなアニメーションを作成できます。

今回はより具体的な例を取り上げてみましょう。

各例では、アニメーション作成のコードとその動作について詳しく説明します。

○サンプルコード5:動的なグラフを描画する

まず、動的なグラフの描画方法を学びましょう。

このコードでは、時間と共に変化するデータをプロットするためのアニメーションを作成しています。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)
line, = ax.plot(x, y)

def update(i):
    shift = np.pi / 50.0 * i
    y = np.sin(x + shift)
    line.set_ydata(y)
    return line,

ani = animation.FuncAnimation(fig, update, frames=100, interval=100, blit=True)

plt.show()

この例では、サイン波形が時間と共に右に移動するアニメーションを作成しています。

それはupdate関数内で、各フレームごとにサイン関数の位相をシフトさせることで実現しています。

このアニメーションは100フレームで構成され、各フレームは100ミリ秒間隔で描画されます。

○サンプルコード6:画像をアニメーションで表示する

画像のアニメーション表示も可能です。

この例では、matplotlibのimshow関数を使用して、ランダムな画像を生成し、その画像をアニメーションで表示します。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

fig, ax = plt.subplots()

matrix = np.random.rand(10, 10)
im = ax.imshow(matrix)

def update(i):
    matrix = np.random.rand(10, 10)
    im.set_array(matrix)
    return im,

ani = animation.FuncAnimation(fig, update, frames=100, interval=100, blit=True)

plt.show()

このコードでは、各フレームで新たなランダムな画像を生成し、その画像をimshow関数で表示しています。

これにより、10×10のマトリクス内でランダムな値が動的に変化する様子を視覚的に表現できます。

○サンプルコード7:アニメーションで3Dグラフを表示する

次に、3Dグラフをアニメーションで表示する方法を見てみましょう。

この例では、matplotlibの3D描画機能を用いて、時間とともに形状が変化する3Dサーフェスグラフを描画します。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

surf = ax.plot_surface(X, Y, Z, cmap='viridis')

def update(i):
    ax.clear()
    Z = np.sin(np.sqrt(X**2 + Y**2) + i / 10.0)
    surf = ax.plot_surface(X, Y, Z, cmap='viridis')
    return surf,

ani = animation.FuncAnimation(fig, update, frames=100, interval=100, blit=False)

plt.show()

このコードでは、plot_surface関数を用いて3Dサーフェスグラフを作成し、update関数内でグラフのZ軸の値を更新しています。

こうすることで、時間の経過とともに波が広がっていく様子を3Dで視覚化できます。

○サンプルコード8:データ視覚化にアニメーションを活用する

最後に、データ視覚化にアニメーションを活用する例を見てみましょう。

この例では、ランダムに生成されるデータのヒストグラムをアニメーションで表示します。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

def update(i):
    ax.clear()
    ax.hist(np.random.randn(1000), bins=50)
    ax.set_title('Histogram of Random Numbers - Frame {}'.format(i))
    return ax,

ani = animation.FuncAnimation(fig, update, frames=100, interval=100, blit=False)

plt.show()

このコードでは、各フレームで新たなランダムなデータセットを生成し、そのデータセットのヒストグラムを作成しています。

これにより、ランダムなデータがどのように分布するかを動的に視覚化できます。

●注意点と対処法

Pythonとmatplotlibでアニメーションを作成する際には、いくつかの注意点があります。

それらについて詳しく見ていきましょう。

○アニメーション作成時のよくあるエラーと対処法

まず、アニメーション作成時のよくあるエラーとその対処法について説明します。

①描画ウィンドウがフリーズする

これは、アニメーション作成中に他のタスクを実行すると発生することがあります。

この問題を解決するには、アニメーションが終了するまで他のタスクを実行しないようにしてください。

②アニメーションが更新されない

これは、アニメーションの更新関数が正しくデータを更新していない可能性があります。

更新関数を見直し、必要に応じてコードを修正してください。

③アニメーションが早すぎる、または遅すぎる

FuncAnimation関数のintervalパラメータを調整することで、アニメーションの速度を変更できます。

●カスタマイズ方法

Pythonとmatplotlibでアニメーションを作成する際には、多くのカスタマイズオプションがあります。

これにより、データを視覚化する方法や視覚表現のスタイルを自由に選択でき、さまざまなニーズに対応することが可能です。

○色々なグラフスタイルの設定方法

最初に、matplotlibでは、あらかじめ定義された多くのスタイルが用意されており、それらを活用することで手軽にグラフの見た目を変えることができます。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# ggplotスタイルを適用
plt.style.use('ggplot')

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)

line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x + i / 100))  # update the data.
    return line,

ani = animation.FuncAnimation(fig, animate, interval=100)

plt.show()

このコードでは、plt.style.use('ggplot')を使って、ggplotスタイルを適用しています。

これにより、グラフの配色や線のスタイルなどがggplot風に変更されます。

○アニメーションのパラメータを調整する方法

次に、アニメーションのパラメータを調整する方法について見ていきましょう。

アニメーションの作成にはFuncAnimation関数を用いますが、この関数ではアニメーションの挙動を制御するための多くのパラメータが提供されています。

具体的には、次のようなパラメータがあります。

  • frames:アニメーションのフレーム数を指定します。
  • interval:フレーム間の時間(ミリ秒)を指定します。
  • repeat:アニメーションを繰り返すかどうかを指定します。

これらのパラメータを調整する例を紹介します。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)

line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x + i / 100))  # update the data.
    return line,

# フレーム数を200に、フレーム間の時間を50ミリ秒に、繰り返しをFalseに設定
ani = animation.FuncAnimation(fig, animate, frames=200, interval=50, repeat=False)

plt.show()

このコードでは、FuncAnimation関数のパラメータを指定して、アニメーションのフレーム数を200に、フレーム間の時間を50ミリ秒に、そして繰り返しを行わないように設定しています。

まとめ

これまでの解説で、Pythonとmatplotlibを用いたアニメーションの作成方法について学んできました。

また、アニメーションのカスタマイズ方法や、一般的な問題の解決策についても解説しました。

これらの知識を活用して、自身でアニメーションを作成し、データを視覚的に表現する力を身につけてください。