Matplotlibを使って動画を作成する

今回はpythonの画像描写ライブラリmatplotlibのArtistAnimation,basemapを使って以下のような動画を作成していきます。
題材はこちらで実装したプロ野球のスケジューリングです。

ArtistAnimationでは、予め用意した複数の画像を、パラパラ漫画のようなイメージで動画にしていきます。

まずは必要なモジュールをインポートします

from Matplotlib import pyplot as pat
from matplotlib.animation import ArtistAnimation # 動画作成用
from mpl_toolkits.basemap import Basemap # 地図を描写するため
import os # 画像保存時のパス作成のため

続いて、動画の元となる画像を作成し、listに格納していきます。
まずは、描写に必要な情報と空のリストを用意します。

artists = []
# 定数の設定
# total_game...総試合数
# schedule...teamの移動スケジュール
# coordinates...各球団の本拠地の座標が入った辞書

# 移動経路を入れておくリスト
route_x = []
route_y = []    

続いて、地図を描写します。

# 地図の描画
fig = plt.figure(figsize=(4,4))
# 以下のmが地図。この上に色々と描写していく
m = Basemap(projection='lcc', lat_0 = 35.4, lon_0 = 136.7,
           resolution = 'i', area_thresh = 0.1,
           llcrnrlon=128., llcrnrlat=30.,
           urcrnrlon=147., urcrnrlat=46.)
# 海岸線を描く、国境を塗る、海(背景)を塗る, 大陸を塗る
m.drawcoastlines(linewidth=0.25)
m.drawcountries(linewidth=0.25)
m.drawmapboundary(fill_color='skyblue')
m.fillcontinents(color='bisque',lake_color='skyblue')

実際に画像を作っていきます。


# 各チームの本拠地をプロット
# パ・リーグ
x,y = m([coordinates[i][1]for i in range(6)],
        [coordinates[i][0]for i in range(6)])
m.plot(x,y,'bo',markersize=3.5)
# セ・リーグ
x,y = m([self.coordinates[i][1]for i in range(6,12)],
       [self.coordinates[i][0]for i in range(6,12)]) 
m.plot(x,y,'go',markersize=3.5)
# 自チームを赤色でプロット
x,y = m(coordinates[team][1], self.coordinates[team][0])
m.plot(x,y,'ro',markersize=5)

# 移動経路を求める
for k in range(total_game):
    artist = []# これが一枚の画像。
    if k >= len(schedule):
        break
    _, j, stadium = schedule[k]
    if stadium == 'visitor':
        route_x.append(self.coordinates[j][1])
        route_y.append(self.coordinates[j][0])
    else:
        route_x.append(self.coordinates[team][1])
        route_y.append(self.coordinates[team][0])
    route_xx,route_yy = m(route_x[:-2], route_y[:-2])  
    # 移動経路の描画
    # appendでなく += とすることで一枚の画像になる。(appendすると異なる二枚の画像になってしまう。)
    artist += m.plot(route_xx, route_yy, 'darkgray')
    route_xx,route_yy = m(route_x[-2:], route_y[-2:])
    artist += m.plot(route_xx, route_yy, 'r')
    # 出来上がった画像を動画用のリストに入れる
    artists.append(artist)

最後に、作成した動画を保存します。

save_dir = "./result/movies/"
ani = ArtistAnimation(fig, artists, interval=300, repeat_delay=1000)
ani.save(os.path.join(save_dir,'Schedule_{}_{}.mp4'.format(game_type,team))

追伸

今回使用したBasemapは古いツールで、しばらく前に開発が終了しています。地図上にプロットできるツールが見つからなかったため今回はこちらを使用しましたが、より良いものがありましたらぜひ教えてください。

Basemapのインストールはこちらの記事が参考になります。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。

CAPTCHA