この記事の目的
Pythonで以下の様な, 都道府県レベルの塗り分け地図を描く
市区町村レベルならこちらへ
ちなみにデータは全国の乗用車の所有台数を使用した.
ページの最後にコード一覧があります.
解説
色付きの地図を作成するために, japanmap というライブラリを用いる
pip install japanmap
その他ライブラリの準備
import numpy as np
import pandas as pd
import cv2
from PIL import Image
import matplotlib.colors
import matplotlib.pyplot as plt
from japanmap import *
データを読み込み
データはここから2019年のExcelファイルをダウンロードして加工した.
df = pd.read_csv("how_many_cars.csv")
df = df.iloc[:53,:8]
都道府県別の乗用車台数を辞書形式で保存
for k,n in zip(df["運輸支局"], df["乗用車"]):
if k in ["札幌", "函館", "旭川", "室蘭", "釧路", "帯広", "北見"]:
tmp=1
else:
tmp = pref_code(k)
tmp = pref_names[tmp]
#print(k,tmp)
if tmp not in num_dict:
num_dict[tmp] = n
else:
num_dict[tmp] += n
num_dictの中身は、まだこんな感じ
num_dict
>> print(num_dict)
{'三重県': 1161089.0,
'京都府': 1007847.0,
...
'鳥取県': 346273.0,
'鹿児島県': 955360.0}
作成したnum_dictの値を台数から色情報(RGB)に変換
n_min = min(num_dict.values())
n_max = max(num_dict.values())
#print(n_min)
#print(n_max)
cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)
def color_scale(r):
tmp = cmap(norm(r))
return (tmp[0]*255, tmp[1]*255, tmp[2]*255)
for k,v in num_dict.items():
num_dict[k] = color_scale(v)
最終的なnum_dictの中身
num_dict
>> print(num_dict)
{'三重県': (19.5, 157.4059464288972, 241.021876181009),
'京都府': (41.49999999999999, 128.85792190698177, 246.1066417260737),
...
'鳥取県': (127.5, 0.0, 255.0),
'鹿児島県': (47.5, 120.63885699318257, 247.29821868892742)}
japanmapにnum_dictを渡してプロット
plt.figure(figsize=(10,8))
plt.imshow(picture(num_dict))
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()
以上!
コード一覧
pip install japanmap
import numpy as np
import pandas as pd
import cv2
from PIL import Image
import matplotlib.colors
import matplotlib.pyplot as plt
from japanmap import *
df = pd.read_csv("how_many_cars.csv")
df = df.iloc[:53,:8]
num_dict={}
for k,n in zip(df["運輸支局"], df["乗用車"]):
if k in ["札幌", "函館", "旭川", "室蘭", "釧路", "帯広", "北見"]:
tmp=1
else:
tmp = pref_code(k)
tmp = pref_names[tmp]
#print(k,tmp)
if tmp not in num_dict:
num_dict[tmp] = n
else:
num_dict[tmp] += n
n_min = min(num_dict.values())
n_max = max(num_dict.values())
#print(n_min)
#print(n_max)
cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)
def color_scale(r):
tmp = cmap(norm(r))
return (tmp[0]*255, tmp[1]*255, tmp[2]*255)
for k,v in num_dict.items():
num_dict[k] = color_scale(v)
plt.figure(figsize=(10,8))
plt.imshow(picture(num_dict))
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()