アオカケスの鳥かご

日々の出来事を綴っていきたい

matplotlibで作成したレーダーチャートをOpenCVでアニメーション表示する

Pythonでグラフを作成するときの定番とされるmatplotlib。

このmatplotlibでレーダーチャートを作成するときに色々難儀した部分があるので、備忘録も兼ねてここに残しておこうと思います。
なお、グラフの表示にはOpencvを用います。

参考

qiita.com

解説

Opencvではそのままだと日本語を出力できませんが、japanize_matplotlibによってそれを可能にしています。

インストールはpipでいけます。

$ sudo pip3 isntall japanize_matplotlib

ラベルの描画

26行目のset_thetagridsで目盛りを描画するときにラベルも一緒に描画できるのですが、それだとラベルの文字を大きくしたときにグラフと被ってしまいます。
f:id:aokakes:20191105155939p:plain

そこで、30行目のようにtextで普通にラベルを出力することにします。

text関数は以下のようにパラメータを指定します。
ax.text([角度(※ラジアン)], [中心からの距離], [ラベル])

xとかyで座標を指定するわけでは無いので注意が必要です。


これで描画してみると、先ほどよりは重ならなくなりました。
f:id:aokakes:20191105160756p:plain

しかし、値によっては重なったり離れすぎたりするため、微調整が必要です。


なお、dummy_labelsは目盛りを描画するときに、ラベルを一緒に描画してしまわないように暫定的に設定しているものです。

アニメーション

matplotlibではArtistAnimationやFuncAnimationでアニメーションを作成することができます。

しかし、これによって吐きだされるものはgif画像であるため、その後に繋げることが困難になります。
例えば、matplotlibで作成したグラフをopencvやpillowで読み込んで文字や画像を書き加えたりする場合です。

そこで、無理矢理アニメーションさせるために、グラフを少しずつ描画させながら画像を保存して、最後に連続で表示させるような方法を取ります。


38行目でグラフを連番で保存しています。


13行目で指定したANIMATION_FRAMEはアニメーションのフレーム数を表しています。
当然この値が高ければ画像の数が増えて滑らかになり、低ければ数が減ってカクついた動きになります。

グラフを描画して保存する速さはマシンスペックによって全然変わるので、ストレスが溜まらないちょうどよい滑らかさを探して調整するのがよいかと思います。


41行目から46行目でアニメーション終了後に外枠や各値を描画しています。

表示

64行目以降でレーダーチャートを表示しています。

保存した画像の一覧を取得して、それを連続で切り替えているだけです。
最後に各値も書き加えた完成したレーダーチャートを表示しています。


ここでは仕方なくgifにしていますが、実際はもっと滑らかに動きます。あくまでもイメージとしてご覧ください。
f:id:aokakes:20191105164323g:plain