Pythonで作るツリーマップ統計データ可視化動画
プログラミング言語Pythonは、ライブラリを活用することで様々な統計動画をつくれます。
これまでに紹介した動画作例は「人口ピラミッド」や「都道府県塗分け地図(コロプレスマップ)」。この記事では「ツリーマップ(長方形敷き詰め図)」をつくってみよか。
世界各国の人口にもとづく実際の例はこんな感じ。
(国旗の扱いはこちらの記事で)
過去記事と同様、ソースコードは最低限で、動画作成の方針のみを示す記事になるのでご注意を。
大まかな方針
これまでの作例と同じくデータの準備は完了しているものとして。データをPandasで扱い、Matplotlibで描画していきましょ。
Matplotlibで、こまやかな調整をくわえて動画を作るならmatplotlib.animation.FuncAnimationで。詳細はよそで学んどいてやーというわけで公式。
そして、ツリーマップ(Treemap)作成のためにSquarifyをつかいます。
ツリーマップを作るには長方形で空間を充填するアルゴリズムが必要やねんけど、そのアルゴリズムを提供しているライブラリがSquarify。
ふつうの数値の配列を入力として、どこにどんな大きさの長方形を描くといいかというデータを出力してくれるやつ。
squarifyに関する諸々のこと
再帰的なsquarify
ツリーマップはそもそもがカテゴリーにより階層化されたデータを見やすくする可視化方法なので、全体と部分を別々に扱いたい場合がありまして。
たとえば都道府県ごとの人口割合を示す場合に、まず関東地方や近畿地方で大まかに区切ってから各都道府県を表示する場合など。
そういうときはまず「地方」の単位でアルゴリズムを活用し、得られたデータに基づいて「都道府県」の単位であらためてアルゴリズムを活用する工夫が必要。これを再帰的と呼ぶかどうかはさておき、まぁ実現可能ではあるので目的に沿って様々試みる必要はあるかと。
squarify.plotしない
描画用のメソッドとしてsquarify.plotがあるんやけど、FuncAnimationで動画を作るときは基本的にplotメソッドは使わへんという基本方針をおすすめ。
FuncAnimationでは各種Artist(図形オブジェクト)に対してデータに沿った変更を加えていくのが基本なので、plotメソッドでArtistとAxes(軸)が暗黙に密結合した状態でつくられるよりは、これらのオブジェクトをそれぞれ自作し、明示的に配置するのがいいですね。
よって、Rectangle(長方形オブジェクト)を用意し、squarifyによって得られたデータをその都度setしていくことに。
何を言ってるかわからなければ、冒頭に示した過去の作例をたどったり、オブジェクト指向な思想でMatplotlibの理解を深めてや👍
padded_squarifyが効かない
アルゴリズムを自作せずライブラリを活用するショートカットの欠点は小回りが利かへんこと。
長方形で充填したいけど、ちょっと隙間が欲しいなとか。そんなちょっとした要望が出てきたときどうするか。
いや実はありがたいことにsquarifyではpadded_squarifyという隙間(パディング)を考慮したデータを出力してくれるメソッドがあって、これを使えばええやんと。思わされるところがワナでして。
def pad_rectangle(rect):
if rect["dx"] > 2:
rect["x"] += 1
rect["dx"] -= 2
if rect["dy"] > 2:
rect["y"] += 1
rect["dy"] -= 2
ソースコードをたどらなわからへんけど、実はパディングの数値は決め打ちで設定されてます。割合じゃなくて絶対値なので、たとえば数値の大きなデータでは隙間が小さすぎて全然効かへんし。あるいは小さな数値のデータやったら隙間が大きすぎるとか。
データにあわせた設定は自分で考えましょう。まぁでも単純なのでアルゴリズム改変は数回の試行錯誤でなんとかなるかと。
アニメーション
パラパラ漫画
Matplotlibでアニメーション動画を作る場合、頭の中に描く基礎概念はパラパラ漫画。動きはデータに従う、というわけで。
データ(Pandas)⇒データ(Squarify)⇒図形オブジェクト(Matplotlib)⇒画像
この流れでちょっとずつちがう画像を大量につくり、貼り合わせることで動画化するわけやね。そのための仕組みとしてpandas.DataFrame.groupbyは有能。
色合い
あと長方形の色によってデータの変化なんかも表現できるから、これをアルゴリズムに組み込む応用もおすすめ。データから色を決定し、長方形に設定するのは位置・大きさを設定する同じ流れで作ればよし。
おわりに
方針としてはこんな感じやね。こだわりだすと終わらないのがPython動画創作。でもかなりのことができるのがやっぱり魅力なPython動画DIY。
統計データ可視化したい勢にはおすすめ。