グラフアニメーションを生成したい
改めて機械学習の勉強を始めるのにあたってグラフのプロットをアニメーションで表示させたくなった。Python ライブラリの matplotlib には直接アニメーションを表示させる機能もあるが、環境情報を Docker コンテナのコンソールに閉じ込めたいし、生成物を簡単に共有したい。そう考えると生成物自体をアニメショーンGIFにできると嬉しい。
上記情報があったので参考にさせてもらいつつ、imagemagick を Docker コンテナにインストールする事でホストマシンへの影響を最小限にする。
imagemagick をインストールする Docker 環境の作成
- imagemagick を make するのは結構しんどいのであきらめ
- Debian ベースの python:3.8.1-slim イメージを用いて apt install したらあっさり
FROM python:3.8.1-slim ENV TZ JST-9 RUN pip3 install --upgrade pip COPY ./requirements.txt /requirements.txt RUN pip3 install -r /requirements.txt RUN apt-get update && \ apt-get install -y imagemagick RUN mkdir /data ENTRYPOINT ["python3","/data/src/main.py"]
- はてなブログのSyntaxハイライトが Dockerfile に対応していない問題
- Python からグラフを取り扱うための requirements.txt も用意しておく
matplotlib == 3.1.2 numpy == 1.18.0 pandas == 0.25.3
- 生成ファイルをホストマシンで取り扱うように docker-compose.yml を作成
- ホストマシン上の ./src をコンテナ上の /data/src に共有してプログラム実行
- コンテナ上の /data/work に出力したらホストマシン上の ./work に出力
version: '2' services: python-test: build: . container_name: 'python-test' tty: true volumes: - './src:/data/src' - './work:/data/work' working_dir: '/data/work'
- docker-compose でビルド
$ docker-compose build python-test
- 下記コマンド ./src/main.py が実行される
$ docker-compose run python-test
グラフプロットプログラムの作成
- matplotlib の基本的な使い方は下記の通り
- 3次関数のプロットをアニメーションGIF化するプログラムの作成
import datetime import matplotlib.pyplot as pyplot import matplotlib.animation as animation figure = pyplot.figure() graphs = [] for i in range(-30, 30, 1): g = pyplot.plot(i, i ** 3, 'o', color='red') graphs.append(g) now = datetime.datetime.now() anime = animation.ArtistAnimation(figure, graphs, interval=50) anime.save(f'plot_{now:%Y%m%d_%H%M%S}.gif', writer='imagemagick')
- graphs 配列にプロット結果を格納していって ArtistAnimation オブジェクト生成
- ArtistAnimation から imagemagick を用いて アニメーションGIF を出力
アニメーションは四次元目
以上まででグラフのプロットをアニメーション GIF で表示させて共有可能となった。そもそもやりたかったのは、『つくりながら学ぶ! 深層強化学習 ~PyTorchによる実践プログラミング~』にあった迷路分析エージェントの可視化である。本書では Project Jupyter | Try Jupyter というWebサービスを使っているのだけど、Webブラウザ上でコーディングするのはやりづらいので、自前環境を構築した。
アニメーション生成が手軽にできると視覚的に理解可能な縦横奥行きという三次元に加えて時間軸という四次元目の表現が簡易にできるのが面白い。アニメーション GIF 自体は廃れかけた技術ではあるが、 Slack や Github の wiki 等でも簡易に扱えるという意味ではむしろ有用性が上がっているようにも思えるので活用していきたい。