見出し画像

Pythonで作る都道府県塗分け日本地図動画(YouTube投稿可)

Pythonで都道府県ごとに日本地図を塗りぬり…すると、こんな動画が出来上がります。



東京一極集中の影響により各県の変化が見えづらいグラフとなっていますが、年次ごとの各県別データさえあれば様々な応用可能性が広がるマップグラフです。

本noteでは同様の取り組みを始めたいと思っている方、Pythonで何かできないかと考えている方向けに、日本地図グラフ作成の方針をお示しします。

以前のノートより

こちらの記事では、Pythonで人口ピラミッドを作成する方針をお知らせしました。今回も大きな流れは変わりません。Pandasでデータを調整し、Matplotlibで日本地図を描きます。

したがって今回主にお知らせする内容は「(動画へと展開しやすいような)Matplotlibによる日本地図の枠組み・静止画の描き方」です。詳細や実際のコードにはほとんど触れませんので、適宜ググるなどして情報を得るようにしてください。

日本地図をできるだけ簡単に描く

Pythonで、Matplotlibで日本地図を描くことを考える場合、まずは大元となる地図データが必要です。そしてまさにこのために作成されたライブラリjapanmapが存在しています。詳細は下記リンク先の作者様による解説記事をご覧ください。

japanmapでは都道府県別の塗分け地図グラフを以下のいずれかで作成します。

ー予め用意されたPNGファイルへの上塗りデータ
SVG形式のデータ

PNGの場合、読み込まれる地図はあらかじめjapanmapライブラリ内に用意されたものであり、固定的で改変の自由度はほとんどありません。またいずれ動画化することを考えれば、画像読み込みデータをそのまま使うのは得策ではありません(動画化することは可能ですが非常に時間がかかってしまう)。

したがって、SVG形式のデータを活用することになります。SVGについては触れませんので各自にてお調べください。

SVGデータをMatplotlibで扱うには…

本節では失敗談も含めやや回りくどい内容を含みます。面倒な方は「SVGのpathをMatplotlibのPathへと変換すればよい」という結論だけ抑えて次節へGO!

ーーー

さありて。

SVGフォーマットのデータをMatplotlibで扱うにはどうすればよいでしょうか。※

※残念ながらここではSVG形式として主にブラウザでの表示向けに提供されている全機能は対象にしません。簡単なpathのみを対象とすることになります。

真っ先に思い浮かび実行したのは「SVGデータをブラウザで表示させよう」でした。Matplotlib関係ねぇ…。ブラウザで表示させるようにSVGを組み上げ、CSSやJavaScriptを駆使して動的に表示を変化させ、キャプチャアプリで撮像して動画編集ソフトに取り込み…という、人間の手と目を必要とする方法です。効率は上がりません。しんどい。

次に実行したのは、SVG形式のデータを一旦PNGファイルへと変換し、PNGファイルを読み込んで動画化するもの。予め与えられたPNGファイルを利用するのと異なり、SVG形式としての自由度やきれいな表示を生かすことが可能な方法です。ただしこれもまたMatplotlib内部で完結しない、Matplotlibの構造や機能を殺す方法なのであって、ファイル読み書き等も重なり動画化するには非常に大きな時間がかかってしまいました。

都道府県塗分け地図プロットを動画として展開するために必要な要件は、Matplotlibの機能を活用し、Matplotlibの内部で完結するよう日本地図を表現することだと理解しました。

そのために利用したのがsvgpath2mplです。

その名の示す通り、SVG形式のpathをMatplotlibのPathオブジェクトに変換してくれます。

パスからパスへ

SVG形式で表現された都道府県別pathは、japanmapライブラリによりSVGファイル内にプレーンなテキストとして出力されます。もしこの状態から地図を少し傾けるなど編集が必要な場合にはInkscapeなどベクタ画像を扱えるドローソフトで編集し、SVG形式で保存すれば必要な編集済みpathをテキストとして取得できます。なお、この時に生成されるpathはドローソフトで設定した描画サイズに依存する可能性があるためご注意ください。

準備が出来たら(呼び方は適当ですが)pathタグのd属性データをsvgpath2mplライブラリでPathオブジェクトに変換しましょう。都道府県ごとのpathデータをPythonの辞書やリストとして持っておくと便利です。

これで、Matplotlibの内部で日本地図を表現することが出来ました。SVG編集との兼ね合いで、もしかすると出力時には軸の最大値や向きを調整する必要があるかもしれません。

あとはPathオブジェクトを適宜調整するだけ。

パスから動画へ

Matplotlibで統計動画を作成するには、PandasのDataFrameが便利です。DataFrameの機能として提供されているグループ化(groupby)を活用して日付毎のDataFrameのリストを作成すれば、あとはFuncAnimationにframeとして順次渡すだけ。

詳細は以前のノートをご参照ください。

DataFrameには都道府県別の色指定データを含むようにします。

日付毎・都道府県別にPathオブジェクトのfillを指定色に変更することを繰り返せば動画のメイン部分は完成。あとは添え物としてText等を配置するなどすれば、YouTubeなどで見てもらえるクオリティを目指すことも可能です。

コロプレスマップ(階級区分図・区画別段彩図)のすすめ

地図の塗分けチャートを専門用語で「コロプレスマップ」あるいは「階級区分図」「区間別段彩図」と言うそうです。

Wikipedia「階級区分図」によれば、色調にもこだわるべきとの記載がありますね。動画作例としてはカラフルな方が良いかと思い、あるいはあまり深く考えずに「スペクトル色相」を選択しましたが、ここは考慮の余地があるかもしれません。



ともあれコロプレスマップ。ネタ次第では非常に面白い内容になるのではないでしょうか。年次別にこだわらずとも、同一年内のカテゴリ別表示などもできそうですね。

是非お試しを。

この記事が気に入ったらサポートをしてみませんか?