PythonのJapanmapライブラリーで都道府県別のコロプレスマップを作成します。
Japanmapライブラリーは日本の都道府県に特化した可視化ライブラリーなので、扱いがシンプルです。
その特徴は
- 事前準備が簡単:準備するデータが47都道府県名と数値だけ用意すれば良いのでシンプル。
- 境界線情報がいらない:都道府県を分ける地図のジオメトリ情報(境界線情報)などを事前に設定しなくても、自動的に表示されます。
データの準備と前処理
まず独立行政法人 統計センターのSSDSE(教育用標準データセット 47都道府県×多分野90項目をダウンロードします。
!wget https://www.nstac.go.jp/sys/files/SSDSE-E-2022v2.csv
ダウンロードしたCSVファイルをみると、都道府県名と各列にデータが格納されているのがわかります。
全国部分は使わないので削除します。
# 最初の行「全国」を削除
df = df.drop(df.index[[0]])
色分けしたい列部分を[target]変数に入れるだけで生成されます。
今回は、日本人人口比で各地域に外国人人口がどれくらいいるのか?を塗り分けたいので、あらたに「人口比外国人人口」というカラムを作り、その中に各地域にいる「外国人人口」を「日本人人口」で割って格納する。という記述を行いました。これもPandasだと一行で完結するので便利です。
# ターゲット列を生成
target ="人口比外国人人口"
df[target] = df["外国人人口"] / df["日本人人口"]
地図の描画処理
あとは、塗り分けたい列を選択するだけで、地図が描画されます。
# グラフに使うカラーマップを作成 OrRd
cmap = plt.get_cmap('jet')
# カラーマップに合わせて色分けするために、最小値と最大値、正規化関数(ノーマライズ関数)を定義
min_val = df[target].min()
max_val = df[target].max()
norm = plt.Normalize(vmin=min_val, vmax=max_val)
# グラフ用の領域(サブプロット)を作成
fig, ax = plt.subplots(1,1, figsize=(12,12))
ax.set_title(target, fontsize=26)
fig.text(0.3, 0.22, f"最大 日本人一人当たり{round(df[target].max(),4)} 人", fontsize="xx-large")
fig.text(0.3, 0.2, f"最小 日本人一人当たり{round(df[target].min(),4)} 人", fontsize="xx-large")
# カラーマップの凡例を表示
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
# コロプレス日本地図画像用の関数fcolを定義します。
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
# 日本地図を表示
plt.imshow(jm.picture(df[target].apply(fcol)))
plt.savefig(f"{target}.png")
plt.show()
塗り分けを行いたい列にある、最小単位と最大単位をとって、カラーのグラデーションを行います。
色(cmap)の種類はこちらを参考に入力すると簡単に変えられます。
今回は「Jet」という色見本を使いました。
コードを大幅に改変することなく、データを都道府県別に用意して、列にそれぞれの値を入れるだけで、すぐにコロプレスマップが作成されるので、とても便利です。