LoginSignup
9
12

More than 3 years have passed since last update.

【Python】都道府県別のデータを地図にプロットする(全国の車の所有台数)

Last updated at Posted at 2019-11-28

この記事の目的

Pythonで以下の様な, 都道府県レベルの塗り分け地図を描く
市区町村レベルならこちら

how_many_cars_map.png

ちなみにデータは全国の乗用車の所有台数を使用した.

ページの最後にコード一覧があります.

解説

色付きの地図を作成するために, 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()
9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12