Pythonで作る画像つき統計データ可視化動画/国旗例
このnoteは下記記事からのつづきもの。
経緯だけ抜粋しておこう。ツリーマップ(長方形充填図)を作りたい。で、年次推移を示すため動画にしたいと。じゃあPythonでいけるよねと。Pandas、Matplotlibよねと。
で、具体的な作例が世界各国の人口分布を示すものだったので、できれば国旗によって国を表示したいなぁなんて。万国博覧会だってあるし(?)
グラフ上の任意の位置に画像をおく。これを実現しよう。
とりあえず、画像の用意。
国旗画像
PNGがほしい
先人の偉大な貢献により、国旗画像は簡単に入手可能。
丸型でよければこちら…と思いきや。
MY(マレーシア🇲🇾)の欠損によって使いづらい。
SVGからPNG生成
直接PNGでの提供がなければSVGからPNG画像を生成しちゃおうというわけで。
こちらのSVGはmaskによって丸型にしているので、それに対応しているライブラリを使って変換。CairoSVGなら変換OK。
四角形でもいけそ?
SVG直接?
PNG画像を介さずSVGをグラフに掲載する方法もありそうやけど。
matplotlib自体がSVGを直接サポートしてないけど上記リンク先をみれば裏技的にできそうで、でもちょっと試行錯誤してうまくいかなかったので今回はパス。
グラフに画像を配置して
公式作例
Matplotlib公式がグラフ上に画像をおくデモを掲載。
これを参考にすればいけるはず。というか、いけた。
おおまかな方針
デモのとおりすすめよ。
OffsetImageで画像を読み込み、AnnotationBbox上に画像を配置。枠の有無やらなんやらは引数で指定。できたAnnotationBboxを表示させたいAxesにadd_artistで追加。
さらに動画化するため、データに従ってAnnotationBboxの位置や大きさを調整。AnnotationBboxには注釈表示位置を設定するsetメソッドが(たぶん)ないので、xyannという属性に対して表示位置を示す(x, y)のタプルを設定。
以上。AnnotationBboxという注釈オブジェクトがミソやね。
おわりに
画像がもつ瞬間把握効果はかなりのもんで。文字で国名を記すより国旗で示した方が何倍もわかりやすい。
データ可視化にこの効果を取り入れない理由はないんよね。
ただ、国旗みたいな普遍的な画像群を除くとちゃんとした画像セットを入手するのがそもそも困難みたいなこともあって…。
まぁ活用できるときにスムーズに活用できるよう、AnnotationBboxの使い方を知っとくのは悪くないはず。