[Python] 지도 시각화 - Folium

is Yoon·2023년 10월 28일

Python & Data

목록 보기
4/4

🗺️ 다양한 종류의 지도 제작 및 디자인을 위한 folium

단계 구분도 choropleth map
지역별 통계치를 색깔 차이로 표현한 지도


1. 지도 데이터 준비하기

  • import json
  • json.load(open('file.geojson', encoding='UTF-8'))

2. 분석 데이터 준비하기

3. 단계 구분도 만들기

  • pip install folium
  • 배경 지도 만들기 folium.Map(location=[위도, 경도], zoom_start=n)
    - zoom_start : 지도 확대 정도
    - tiles : 지도 종류
    마우스를 이용해 위치를 옮기거나, 휠을 이용해 확대/축소 가능
  • 계급 구간 정하기 quantile() 이용해 구간 정하기
  • 단계 구분도 만들기 folium.Choropleth(parameters)
    - geo_data : 지도 데이터
    - data : 색깔로 표현할 통계 데이터
    - columns : 통계 데이터의 행정 구역 코드 변수, 색깔로 표현할 변수
    - key_on : 지도 데이터의 행정 구역 코드
    - bins : 계급 구간 기준값
    - fill_color, nan_fill_color : 컬러맵, 결측치 색깔
    - fill_opacity, line_opacity : 투명도 (0~1) , 경계선 투명도 (0~1)
    .add_to(배경지도) : 배경지도에 단계 구분도 덧씌우기

folium 활용하기

  • HTML 파일로 저장하기 지도.save('file.html')
  • 웹 브라우저에서 html 파일 열기 import webbrowser, webbrowser.open_new('file.html')


데이터 출처

# 시군구별 인구 단계 구분도 만들기
%pip install folium

# 1. 시군구 경계 지도 데이터 준비하기
import json
geo = json.load(open('SIG.geojson', encoding='UTF-8'))

# 2. 시군구별 인구 데이터 준비하기
import pandas as pd
df_pop = pd.read_csv('Population_SIG.csv')
df_pop['code'] = df_pop['code'].astype(str)

# 3. 단계 구분도 만들기 (배경 지도 map_sig, 계급 구간 bins)
import folium
map_sig = folium.Map(location = [35.95, 127.7], zoom_start = 8, tiles = 'cartodbpositron')
bins = list(df_pop["pop"].quantile([0, 0.2, 0.4, 0.6, 0.8, 1]))

folium.Choropleth(geo_data = geo,
				  data = df_pop,
                  columns = ('code', 'pop'),
                  key_on = 'feature.properties.SIG_CD',
                  fill_color = 'YlGnBu'
                  full_opacity = 1,
                  line_opacity = 0.5,
                  bins = bins).add_to(map_sig)

map_sig

데이터 출처

# 서울시 동별 외국인 인구 단계 구분도 만들기
# 1. 서울시 동 경계 지도 데이터 준비하기
import json
geo_seoul = json.load(open('EMD_Seoul.geojson', encoding='UTF-8'))

geo_seoul['features'][0]['properties']   # 행정 구역 코드 출력
geo_seoul['features'][0]['geometry']     # 위도, 경도 좌표 출력

# 2. 서울시 동별 외국인 인구 데이터 준비하기
foreigner = pd.read_csv('Foreigner_EMD_Seoul.csv')
foreigner['code'] = foreigner['code'].astype(str)

# 3. 단계 구분도 만들기
bins = list(foreigner["pop"].quantile([0, 0.2, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]))
map_seoul = folium.Map(location=[37.56, 127], zoom_start=12, tiles='cartodbpositron')
folium.Choropleth(geo_data=geo_seoul, data=foreigner, columns=('code', 'pop'), key_on='feature.properties.ADM_DR_CD', fill_color='Blues', nan_fill_color='White', fill_opacity=1, line_opacity=0.5, bins=bins).add_to(map_seoul)

# 4.꾸미기 - 구 경계선 추가
geo_seoul_sig = json.load(open('SIG_Seoul.geojson', encoding='UTF-8'))
folium.Choropleth(geo_data = geo.seoul_sig, fill_opacity=0, line_weight=4).add_to(map_seoul)

map_seoul
profile
planning design development with data

0개의 댓글