今回は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のインストールはこちらの記事が参考になります。
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント