【Python】도도부현별 데이터를 지도에 플롯한다(전국의 자동차 소유 대수)

이 기사의 목적



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()

좋은 웹페이지 즐겨찾기