Skip to content

Matplotlibアニメーションチュートリアル-見事なビジュアライゼーションを作成

Updated on

データの可視化は、それを使いこなす人々の手においては強力なツールです。複雑なデータセットを理解可能な洞察に変換することができ、アニメーションの使用により、これらの洞察をさらに魅力的にすることができます。そこで、Pythonの多目的ライブラリであるMatplotlibが登場します。Matplotlibは、Pythonで静的、アニメーション、インタラクティブなビジュアライゼーションを作成することができ、データサイエンティストやアナリストにとって必須のツールです。

このチュートリアルでは、Matplotlibのアニメーション機能に焦点を当てます。アニメーションの作成方法、アニメーション化できる異なるプロットの種類、およびアニメーションを保存できるさまざまな形式について探求します。また、Jupyterノートブックでアニメーションが機能しないなどの一般的な問題とその解決策についても取り上げます。したがって、経験豊富なデータサイエンティストまたは初心者の方にも、このチュートリアルは何かしらの価値があります。

Python Pandas Dataframeからコードなしで素早くデータ可視化を作成したいですか?

PyGWalkerは、可視化を伴う探索的データ分析のためのPythonライブラリです。 PyGWalker (opens in a new tab)は、pandasのデータフレーム(およびpolarsのデータフレーム)をTableauスタイルのユーザーインターフェースに変換することにより、Jupyter Notebookデータ分析およびデータ可視化ワークフローを簡素化することができます。

PyGWalker for Data visualization (opens in a new tab)

Matplotlibアニメーションとは何ですか?

Matplotlibアニメーションは、動的なビジュアライゼーションを作成するためのMatplotlibライブラリの機能です。静的なプロットとは異なり、アニメーションでは時間の経過に伴う変化を表示することができ、時系列データの表現に優れたツールとなります。たとえば、年ごとの株価、過去10年間の気候変動、または時間の経過によって変化する任意の現象を、アニメーションを使って効果的に示すことができます。

Matplotlibのアニメーションモジュールには、アニメーションを作成するためのフレームワークを提供するいくつかのクラスがあります。その中で最も重要なのは、FuncAnimationクラスです。このクラスは、関数を繰り返し呼び出すことでアニメーションを作成するために使用されます。このクラスを使用すると、各フレームでプロットの状態(またはデータ)が更新されるアニメーションを簡単に作成できます。

Matplotlibを使用してアニメーションを作成する

Matplotlibでアニメーションを作成するには、いくつかのステップが必要です。まず、図とプロットの軸を設定する必要があります。次に、データを各フレームで更新するアニメーション関数を定義します。最後に、FuncAnimationクラスのインスタンスを作成し、図、アニメーション関数、フレーム数を引数として渡します。

次は、ラインプロットのアニメーションを作成する簡単な例です。

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
# 図と軸を設定
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'r-')
 
def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,
 
def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,
 
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()

この例では、init関数でプロットの制限を設定し、ラインオブジェクト(ln)を返します。update関数は各フレームで呼び出され、新しいデータ(フレーム番号のsin)をydataに追加し、ラインオブジェクトのデータを更新します。次に、FuncAnimationクラスを使用してアニメーションを作成します。

Matplotlibでアニメーション化できるプロットの種類

Matplotlibは非常に柔軟で、さまざまな種類のプロットをアニメーション化することができます。以下にいくつかの例を示します。

  1. ラインプロット:前のセクションで見たように、ラインプロットは時間の経過に伴う1つ以上の数量の変化を示すためにアニメーション化することができます。これは特に時系列データには有用です。

  2. 散布図:散布図は2D空間でポイントの移動を示すためにアニメーション化することができます。これはデータポイントのクラスタリングや分類の可視化に使用することができます。

  3. バープロット:バープロットは、バーの高さで表される数量の変化を示すためにアニメーション化することができます。これはデータセットの時間的な変化を視覚化するために使用することができます。

  4. ヒストグラム:ヒストグラムは、データセットの分布の変化を示すためにアニメーション化することができます。

  5. 3Dプロット:Matplotlibは3Dプロットもサポートしています。3Dデータセットの変化を示すために3Dプロットをアニメーション化することができます。これは3D科学データの視覚化に役立ちます。

  6. サブプロット:複数のサブプロットを同時にアニメーション化することができます。これは異なるデータセットまたは同じデータセットの異なるビューを比較するために使用することができます。

覚えておくべきは、アニメーション化するプロットのタイプは、データの性質とビジュアライゼーションで伝えたい内容に依存するということです。

Matplotlibアニメーションの保存

アニメーションを作成したら、将来の使用のために保存したり、他の人と共有するために保存したりすることがあります。Matplotlibでは、この目的のためにAnimation.saveメソッドが提供されています。このメソッドを使用すると、MP4、AVI、およびHTML5ビデオなど、さまざまな形式でアニメーションを保存することができます。

以下は、アニメーションを保存する方法の例です。

ani.save('animation.mp4', writer='ffmpeg', fps=30)

この例では、アニメーションはFFmpegライターを使用してMP4ファイルとして保存されます。fpsパラメータは保存されたアニメーションの1秒あたりのフレーム数を指定します。

アニメーションを保存するには、適切なライターがシステムにインストールされている必要があります。一般的な形式では、Matplotlibは自動的に適切なライターを使用します。ただし、一部の形式では、追加のソフトウェアのインストールが必要な場合があります。たとえば、MP4ファイルとしてのアニメーションの保存には、システムにFFmpegがインストールされている必要があります。

このチュートリアルの次の部分では、Matplotlibでアニメートできるさまざまな種類のプロットについて詳しく説明し、それぞれの例を提供します。また、3Dプロットのアニメーション、プログレスバーアニメーションの作成方法、プロットにテキストアニメーションを追加する方法についても説明します。お楽しみに!

Matplotlibを使用した3Dプロットのアニメーション

Matplotlibの3D機能を活用すると、データの視覚化に追加の次元を追加する魅力的なアニメーションを作成できます。プロセスは2Dアニメーションを作成するのと似ていますが、2Dの代わりにAxes3Dクラスを使用して3Dのプロットを作成します。

ここでは、3Dサーフェスのアニメーションの作成例を示します:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))
 
def update(num):
    ax.view_init(elev=10., azim=num)
    return ln,
 
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 100), blit=True)
plt.show()

この例では、update関数がプロットの表示アングルを各フレームごとに変更し、回転効果を作成します。

Matplotlibを使用したプログレスバーアニメーションの作成

プログレスバーは、計算やプロセスの進行状況を視覚化するのに便利な方法です。Matplotlibでは、リアルタイムで更新されるアニメーション化されたプログレスバーを作成できます。以下に単純な例を示します:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
bar = plt.bar([0], [0], color='b')
 
def update(i):
    bar[0].set_height(i / 100.)
    return bar
 
ani = FuncAnimation(fig, update, frames=range(101), repeat=False)
plt.show()

この例では、各フレームでバーの高さが更新され、プログレスバーが満たされる効果が作成されます。

Matplotlibプロットにテキストアニメーションを追加する

プロットにアニメーション化されたテキストを追加することで、それらをより具体的で魅力的なものにすることができます。Matplotlibプロットでは、TextクラスとFuncAnimationクラスを使用してテキストをアニメーション化することができます。以下に例を示します:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
text = ax.text(0.5, 0.5, '', ha='center')
 
def update(i):
    text.set_text(f'Frame {i}')
    return text,
 
ani = FuncAnimation(fig, update, frames=range(10), blit=True)
plt.show()

この例では、プロットに表示されるテキストが各フレームで更新され、シンプルなテキストアニメーションが作成されます。

Matplotlibで複数のサブプロットをアニメーション化する

Matplotlibでは、1つの図内に複数のサブプロットを作成し、それぞれを個別にアニメーション化することができます。これは、異なるデータセットや同じデータセットの異なるビューを並べて比較したい場合に特に便利です。以下は、複数のサブプロットをアニメーション化する方法の例です:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, axs = plt.subplots(2)
 
x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
line1, = axs[0].plot(x, y1, color='blue')
line2, = axs[1].plot(x, y2, color='red')
 
def update(frame):
    line1.set_ydata(np.sin(x + frame / 100))
    line2.set_ydata(np.cos(x + frame / 100))
    return line1, line2
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

この例では、サイン波を表示する1つのサブプロットとコサイン波を表示する別のサブプロットがあります。update関数は波の位相を変更し、2つの波が同期して移動するアニメーションを作成します。

色パレットを変更しながらアニメーションを作成する

アニメーションの色パレットを変更することで、視覚化に情報を追加することができます。たとえば、2Dプロットで第3の次元を表すために色を使用したり、特定のデータポイントを強調するために色を使用したりすることができます。色パレットを変更するアニメーションを作成する方法の例を以下に示します:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.cm import get_cmap
 
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
scat = ax.scatter(x, y, c=y, cmap=get_cmap('viridis'))
 
def update(frame):
    y = np.sin(x + frame / 100)
    scat.set_offsets(np.c_[x, y])
    scat.set_array(y)
    return scat,
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

この例では、scatter関数を使用してサイン波の散布図を作成します。各ポイントの色はそのy値によって決まります。update関数は波の位相を変更し、ポイントの色を更新して、移動する波と変化する色パレットのアニメーションを作成します。

Matplotlibを使用してリアルタイムデータをアニメーション化する

Matplotlibのアニメーションは、リアルタイムデータを視覚化するためにも使用することができます。これは、センサーデータの監視、株価の追跡、機械学習アルゴリズムの視覚化など、さまざまなアプリケーションで役立ちます。リアルタイムデータをアニメーション化する方法の例を以下に示します:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
line, = ax.plot([])
 
def update(frame):
    line.set_data(range(frame), np.random.rand(frame))
    ax.relim()
    ax.autoscale_view()
    return line,
 
ani = FuncAnimation(fig, update, frames=range(1, 101), blit=True)
plt.show()

この例では、「update」関数は各フレームごとに新しいランダムなデータポイントを生成し、リアルタイムのデータをシミュレートしています。プロットの範囲は、新しいデータに適応するために各フレームで更新されます。

Matplotlibを使用した科学的シミュレーションのアニメーション

Matplotlibのアニメーション機能を使用すると、科学的シミュレーションを視覚化することができます。

たとえば、物理学のシミュレーションにおける粒子の動き、生物学のシミュレーションにおける人口の増加、または感染症の広がりにおける疫学のシミュレーションなどをアニメーション化することができます。以下は、バウンドするボールの単純な物理シミュレーションのアニメーション化方法の例です:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
 
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ball = plt.Circle((5, 5), 0.5, color='blue')
ax.add_patch(ball)
 
vx, vy = 0.1, 0.2  # 速度
 
def update(frame):
    x, y = ball.center
    x += vx
    y += vy
    if x > 10 or x < 0:  # エッジに当たったら跳ね返る
        vx *= -1
    if y > 10 or y < 0:
        vy *= -1
    ball.center = (x, y)
    return ball,
 
ani = FuncAnimation(fig, update, frames=range(100), blit=True)
plt.show()

この例では、「update」関数はボールの位置をその速度に基づいて更新し、ボールがプロットの端に当たった場合には速度を逆にして、跳ねるボールのアニメーションを作成しています。

よくある質問

  1. Matplotlibアニメーションとは何ですか?
    Matplotlibアニメーションは、PythonのMatplotlibライブラリの機能であり、動的な視覚化の作成を可能にします。静的なプロットとは異なり、アニメーションは時間の経過に伴う変化を表示することができ、時系列データを表現するための優れたツールです。

  2. Matplotlibを使用してアニメーションを作成する方法は?
    Matplotlibでアニメーションを作成するには、プロットの図と軸を設定し、各フレームでデータを更新するアニメーション関数を定義し、FuncAnimationクラスのインスタンスを作成して、図、アニメーション関数、フレーム数を引数として渡す必要があります。

  3. Matplotlibでアニメーション化できるプロットの種類は?
    Matplotlibでは、線プロット、散布図、棒グラフ、ヒストグラム、3Dプロット、サブプロットなど、さまざまな種類のプロットをアニメーション化することができます。