11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

matplotlibで散布図 のアニメーションを作る

Last updated at Posted at 2019-06-29

前回の投稿Pythonで実数値遺伝的アルゴリズムの性能を評価してみるの副産物で、matplotlibで散布図のアニメーションを作るときの情報があまりなかったのでまとめてみました。

#実装

scatter.py
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation as animation

#軸の最小値、最大値
dRange = [0.0 , 1.0]

if __name__ == "__main__":
    #グラフ 散布図
    fig_scatter = plt.figure()
    plt_scatter = []

    # 実行
    for count  in  range(30):
        #グラフ 散布図
        x_1 = []
        x_2 = []
        for n in range(50):
            x_1.append(np.random.rand())
            x_2.append(np.random.rand())
            
        x_scatter = plt.scatter(x_1, x_2 , c="blue")
        
        x_scatter_red  = plt.scatter(np.random.rand(), 
                                     np.random.rand(),
                                     c="red",
                                     marker="*",
                                     s=200)
        # タイトルテキスト
        title = plt.text((dRange[0]+dRange[1]) /2 , dRange[1], 
                         'Count={:d}'.format(count),
                         ha='center', va='bottom',fontsize='large')

        plt_scatter.append([x_scatter,x_scatter_red,title])

    
    #散布図
    # アニメーション作成
    plt.xlim(dRange[0],dRange[1])
    plt.ylim(dRange[0],dRange[1])
    plt.grid(True)
    
    ani = animation.ArtistAnimation(fig_scatter, plt_scatter, interval=500)
    
    # 保存
    ani.save('sample.gif', writer="imagemagick")
    
    #表示
    #plt.show()

#出力結果
sample.gif

#説明
plt.scatter()で散布図のプロットを指定します。複数プロット表示する場合は、x軸とy軸それぞれの配列を渡します。

.py
        for n in range(50):
            x_1.append(np.random.rand())
            x_2.append(np.random.rand())
            
        x_scatter = plt.scatter(x_1, x_2 , c="blue")

特定のプロットだけ、色・形・大きさを変えたい場合は、別途散布図のプロットを作成します。cで色を、markerで形を、sで大きさを指定できます。

        x_scatter_red  = plt.scatter(np.random.rand(), 
                                     np.random.rand(),
                                     c="red",
                                     marker="*",
                                     s=200)

動的なタイトルを付けたい場合は、plt.text()を使います。第1、第2引数で座標を指定しますが、画像の左上からの絶対座標ではなく、プロットの軸上の座標になります。よって、各軸の最小値・最大値動的に変わる場合は、あらかじめ最小値、最大値を決めておいて、後でplt.xlim()plt.ylim()で指定する必要があります。そうしないと、タイトルの位置がいろんなとこに飛びます。

.py
        title = plt.text((dRange[0]+dRange[1]) /2 , dRange[1], 
                         'Count={:d}'.format(count),
                         ha='center', va='bottom',fontsize='large')

plt_scatter.append()で、表示させたい内容を、配列形式で追加します。

.py
        plt_scatter.append([x_scatter,x_scatter_red,title])

アニメーションGIFを保存したい場合は、以下のようにします。
表示したい場合は、'ani.save()'の部分をplt.show()に変更すれば、いいはずですが、現状ColaboratoryやSpyderではうまく表示できませんでした。

.py
    ani = animation.ArtistAnimation(fig_scatter, plt_scatter, interval=500)
    
    # 保存
    ani.save('sample.gif', writer="imagemagick")

#参考
matplotlib でアニメーションを作る

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?