Pythonとmatplotlibでヒストグラムを動的(アニメ―ション)で作る方法

スポンサーリンク

今日は、Pythonプログラミング言語を使って、アニメーションのヒストグラムを得るためのプログラミングをします。

Pythonとmatplotlibは、静的な2Dプロットを作成するために使用することができます。

しかし、matplotlib は動的な自動更新のアニメーションプロットを作成するのにも使える秘密の力を持っています。

さあ、はじめましょう

スポンサーリンク

1. モジュールのインポート

まず最初に、データを作成するための numpy やヒストグラムをプロットするための matplotlib 、最後にアニメーションプロットを行うための matplotlib.animation など、必要なモジュールやライブラリーをインポートすることから始めました。

また、動画を HTML 形式に変換するために、HTML 関数もインポートする予定です。

1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
plt.style.use('seaborn')

2. データセットの作成

データを作成するために、まずランダムな状態を固定することでnumpyモジュールが必要になります。

次に、linespace関数を用いてビンの数を初期化します。

次に、linspace関数を使ってランダムな1000個のデータポイントを作成します。

1
2
3
4
np.random.seed(19680801)
HIST_BINS = np.linspace(-4, 4, 100)
data = np.random.randn(1000)
n, _ = np.histogram(data, HIST_BINS)

3. ヒストグラムをアニメーション化する

ヒストグラムをアニメーション化するためには,乱数を生成してビンの高さを更新し続ける関数 animate が必要です.

1
2
3
4
5
6
7
8
9
10
11
12
def prepare_animation(bar_container):
     
    def animate(frame_number):
        data = np.random.randn(1000)
        n, _ = np.histogram(data, HIST_BINS)
         
        for count, rect in zip(n, bar_container.patches):
            rect.set_height(count)
         
        return bar_container.patches
     
    return animate

3. ヒストグラムのアニメーション表示

hist()関数を使って、BarContainer` ( Rectangle インスタンスのコレクション ) のインスタンスを取得することができます。

次に、prepare_animation を呼び出します。

この関数には animate という関数が定義されています。

最後に、to_html5_video 関数を使用して、プロットを HTML 形式に変換します。

1
2
3
4
5
fig, ax = plt.subplots()
_, _, bar_container = ax.hist(data, HIST_BINS, lw=1,ec="red", fc="blue", alpha=0.5)
ax.set_ylim(top=55)
ani = animation.FuncAnimation(fig, prepare_animation(bar_container), 50,repeat=True, blit=True)
HTML(ani.to_html5_video())

Python でアニメーションのヒストグラムを表示するための完全な実装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
plt.style.use('seaborn')
 
np.random.seed(19680804)
HIST_BINS = np.linspace(-4, 4, 100)
data = np.random.randn(1000)
n, _ = np.histogram(data, HIST_BINS)
 
def prepare_animation(bar_container):
     
    def animate(frame_number):
        data = np.random.randn(1000)
        n, _ = np.histogram(data, HIST_BINS)
         
        for count, rect in zip(n, bar_container.patches):
            rect.set_height(count)
         
        return bar_container.patches
     
    return animate
 
fig, ax = plt.subplots()
_, _, bar_container = ax.hist(data, HIST_BINS, lw=1,ec="blue", fc="yellow", alpha=0.5)
ax.set_ylim(top=100)
ani = animation.FuncAnimation(fig, prepare_animation(bar_container), 50,repeat=True, blit=True)
HTML(ani.to_html5_video())

まとめ

ヒストグラムのアニメーションを楽しんでいただけましたでしょうか?データ、ビンの数、ヒストグラムの速度など、いろいろ試してみてください。

それでは、よいコーデを

Read More

  1. Python Plot:Pythonでアニメーションプロットを作成する
  2. matplotlibでプロットを効率的に行う3つのコツ
  3. Python 滑らかな曲線のプロット
タイトルとURLをコピーしました