충청권 시군구별 종사자 수 Mapboxgl 시각화
1. 라이브러리 설치
import mapboxgl
from mapboxgl.viz import *
import json
import pandas as pd
import geopandas as gpd
from mapboxgl.utils import create_color_stops
from mapboxgl.utils import create_numeric_stops
# 경고 메세지 제거
import warnings
warnings.filterwarnings('ignore')
# mapboxgl 라이브러리 버전 확인
print(mapboxgl.__version__)
mapboxgl.viz 모듈은 Mapbox GL JS를 사용하여 인터랙티브하고 시각적으로 맵을 생성하고 표시하는 기능을 제공하는 파이썬 라이브러리입니다.
mapboxgl.utils 모듈은 Mapbox GL JS를 사용하여 맵 생성 및 데이터 시각화에 유용한 유틸리티 함수를 제공하는 파이썬 라이브러리입니다.
- create_color_stops: 데이터 값을 기반으로 색상 값의 범위를 생성하는 유틸리티 함수
- create_numeric_stops: 데이터 값을 기반으로 수치 범위를 생성하는 유틸리티 함수
2. 지형 데이터 불러오기 및 전처리
# 지형 데이터 불러오기
shape = r'C:\Users\YONSAI\Desktop\study\python\yonsei_final_project\data\siig.shp'
data = gpd.read_file(shape, encoding = 'cp949')
# 데이터프레임의 일부를 선택
chungcheong = data.loc[135:164]
daejeon = data.loc[64:68]
sejong = data[74:75]
geometry = pd.concat([daejeon, sejong, chungcheong]).reset_index(drop = True)
# 열 이름 변경을 위한 딕셔너리
new_column_names = {'SIG_CD': '행정코드', 'SIG_ENG_NM': '행정영어', 'SIG_KOR_NM' : '행정구역', 'geometry' : 'geometry'}
# 열 이름 변경 적용
geometry = geometry.rename(columns = new_column_names)
geometry.head()
3. 데이터 불러오기 및 전처리
data = pd.read_csv(r'C:\Users\YONSAI\Desktop\study\python\Data Visualization\data\시군구별_종사자수.csv', encoding = 'cp949', header = [0, 1])
# 첫 번째 헤더와 두 번째 헤더 합치기
merged_headers = ['_'.join(header) for header in data.columns]
# 합친 헤더를 새로운 헤더로 지정
data.columns = merged_headers
# 열 이름 변경
data.rename(columns={data.columns[0]: '행정구역'}, inplace = True)
# 데이터 합치기
data = pd.merge(geometry, data, on = '행정구역', how = 'outer')
# 열 제거
data.drop(columns = ['행정코드', '행정영어'], axis = 1, inplace = True)
# 데이터 채우기
data.iloc[6:10,2:] = data.iloc[36, 2:] # 청주시
data.iloc[20:22, 2:] = data.iloc[37, 2:] # 천안시
# 행 제거
data.drop(index = [36, 37], axis = 0, inplace = True)
4. 데이터 저장
# GeoJSON으로 변환하여 저장합니다
data.to_file(r'C:\Users\YONSAI\Desktop\study\python\Data Visualization\data\mapboxgl.geojson', driver = 'GeoJSON')
geo_data = r'C:\Users\YONSAI\Desktop\study\python\Data Visualization\data\mapboxgl.geojson'
with open(geo_data) as f:
data = json.loads(f.read())
# 토큰
token = ''
# 충청권 중심부의 경도, 위도 입니다.
center = [127.489, 36.6425]
# 시각화 할 값에 따른 색상의 범주를 지정해줍니다.
color_breaks = [0, 50000, 100000, 150000, 2000000]
color_stops = create_color_stops(color_breaks, colors = 'BuPu')
5. 데이터 시각화
# ChoroplethViz 를 그립니다.
viz = ChoroplethViz(
access_token = token,
data = data,
color_property = '중소기업_2019',
color_stops = color_stops,
center = center,
zoom = 6,
)
# 맵을 출력합니다.
viz.show()
# 맵을 -15도 만큼 좌우 회전하고, 45도 만큼 상하 회전합니다.
viz.bearing = -15
viz.pitch = 45
# 각 데이터에 '인구'를 기준으로 height 값을 줍니다.
viz.height_property = '중소기업_2020'
# 높이의 값을 '인구' 에 따라 0 ~ 50000 사이의 값을 0 ~ 3000 사이의 값으로 매핑합니다.
numeric_stops = create_numeric_stops([0, 10000, 20000, 30000, 40000, 50000], 0, 3000)
viz.height_stops = numeric_stops
viz.height_function_type = 'interpolate'
# render again
viz.show()
댓글남기기