【matplotlib】MatplotlibとPILを使ってGIFアニメーショングラフ作成::X軸方向が一定範囲で追っかけていくグラフ[Python]

  • URLをコピーしました!
目次

MatplotlibとPIL

前回、MatplotlibとPILを使ってどんどん伸びる線グラフのGIFアニメーショングラフ(動くグラフ)を作成してみました。

今回はX軸方向が一定範囲で追っかけていくグラフを作成してみましょう。

どういうアニメーションかというとこんな感じです。

ちなみに元のグラフは前回同様のこのグラフです。

プログラム全体

まずはプログラム全体を見ていきましょう。

今回もグラフ作成はmatplotlibで、GIFアニメーションはPILで作成していきます。

グラフ作成部分

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

x_list = []; y_list =[]
for i in np.arange(0, 10, 0.1):
    x_list.append(i)
    y_list.append(2**i)
    
fig_path = './fig'

for i in range(len(x_list)):
    fig = plt.figure(facecolor='white')
    plt.cla()
    
    plt.plot(x_list, y_list)
    
    plt.xticks(np.arange(0, 10, 0.1))
    
    plt.xlim(x_list[i],x_list[i]+1)
    plt.ylim(0, 1024)
    
    plt.tight_layout()
    
    fig_name = f'{str(i).zfill(4)}.png'
    fig_output = os.path.join(fig_path, fig_name)
    plt.savefig(fig_output)
    plt.close()

前回から大きく変わったのは2点。

「xlim」でX軸方向の表示を制限している範囲を「x_list[i],x_list[i]+1」としています。

これにより一枚の画像で表示される範囲が「1」に制限され、for文で繰り返されるたびに少しずつX軸方向にずれていきます。

もう一点は「plt.xticks(np.arange(0, 10, 0.1))」です。

xticksで数値を指定するとX軸方向の目盛りの並びを指定することができます。

この点に関しては設定する必要がある時と設定する必要がない時が存在します。

今回の場合で「plt.xticks(np.arange(0, 10, 0.1))」を書かなかった場合はこうなります。

右端の枠がパタパタ動いてしまっているのが分かります。

この右端がパタパタ動く原因は今回の場合、X軸の目盛りは0.2刻みで、一枚の画像で動く分が0.1刻みのため、右端の目盛りがあったりなかったりしてしまっていることです。

そこで「plt.xticks(np.arange(0, 10, 0.1))」とすることでX軸の目盛りを0.1刻みとすることで必ず右端にも目盛りが表示されるようにしたというわけです。

軸が動くグラフに関してはこのように目盛りの位置に注意することで綺麗なアニメーションになることでしょう。

アニメーション作成部分

アニメーション作成分は前回と同様です。

from PIL import Image
import os

fig_path = './fig'

im_list = []
for file in sorted(os.listdir(fig_path)):
    file_path = os.path.join(fig_path, file)
    im = Image.open(file_path)
    im_list.append(im)

im_list[0].save("animation.gif", save_all=True, append_images=im_list[1:], duration=50, loop=0)

という感じでグラフを動かしてみるとまた違った理解が生まれたり、説明しやすくなったりするので、また面白いGIFアニメーショングラフを思いついたら試していきたいと思います。

次回からは話が変わってTwitter API v2をTweepyから動かしてみます。

そして次回はTwitter API v2への切り替えを行いましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次