융무의 기술블로그
article thumbnail

https://mjs1995.tistory.com/169?category=802136

 

[python][folium] geojson을 이용한 지도그리기 (1)

원하는 형태의 시군을 이용하여 229개의 시군 지도를 만들어 보려고한다. python을 이용해서 folium 작업을 하기 이전에 geojson 파일을 다운받는 방법부터 설명하려고 한다. www.gisdeveloper.co.kr/?p=2332 대

mjs1995.tistory.com

앞에서 만든 geojson 파일을 가지고 Python Plotly을 이용한 지도 시각화를 하려고 합니다.

 

데이터는 Kosis에 있는 2018년도 시군구별 인구수 데이터를 이용하려고 합니다.

http://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1B040A3&vw_cd=MT_ZTITLE&list_id=A_7&seqNo=&lang_mode=ko&language=kor&obj_var_id=&itm_id=&conn_path=MT_ZTITLE

 

KOSIS

 

kosis.kr

여기서 소멸 위험지수란 20세~39세 이하의  여성인구수를 해당 지역의 65세 이상 고령자 인구수로 나눈 값을 의미합니다.

Plotly를 이용한 지도 시각화

Plotly를 이용한 지도시각화는 공식문서인 Mapbox Choropleth Maps in Python에서 확인할 수 있습니다.(https://plotly.com/python/mapbox-county-choropleth/ )

필요한 라이브러리를 불러옵니다.

<python />
import pandas as pd import json import mapboxgl import os import plotly.express as px
데이터 불러오기

2018년 소멸위험지수 데이터를 가지고 시각화를 진행하려고 합니다.

<python />
df = pd.read_csv('2018년소멸위험지수.csv', encoding='cp949') df['sigun_code']=df['sigun_code'].astype(str) df.head()

geojson 파일

geojson파일을 json.load를 이용해서 불러온 다음에 데이터를 확인해봅니다.

<python />
state_geo ='map (7).zip.geojson' state_geo1 = json.load(open(state_geo, encoding='utf-8')) for idx, sigun_dict in enumerate(state_geo1['features']): sigun_id = sigun_dict['properties']['merged'] sigun_nmm = df.loc[(df.sigun_code == sigun_id), 'sigun_nm'].iloc[0] risk = df.loc[(df.sigun_code == sigun_id), '총인구_여자(명)'].iloc[0] people = df.loc[(df.sigun_code == sigun_id), '총인구_65세이상(명)'].iloc[0] people_w = df.loc[(df.sigun_code == sigun_id), '소멸위험지수'].iloc[0] txt = f'<b><h4>{sigun_nmm}</h4></b>총인구_여자(명) :{risk:.2f}<br>총인구_65세이상(명) : {people}<br>소멸위험지수 : {people_w}' state_geo1['features'][idx]['properties']['tooltip1'] = txt state_geo1['features'][idx]['properties']['risk'] = people_w state_geo1['features'][0]

Choropleth map using plotly.express
  • location : 지도 및 지리에 대한 제한선
  • geojson : 지리 정보
  • color : 시각화할 데이터 값
  • color_continuous_scale : 색상 결정 (https://plotly.com/python/builtin-colorscales/)
  • range_color = 타겟값 범위 색
  • mapbox_style : 지도 스타일
  • featureidkey : df의 locations 와 geojson의 features의 연결하는 키값
  • zoom : 지도보기 크기
  • center : 기준
  • labels : 우측 그래프바 라벨

 

불러온 GeoJSON파일에 id 필드 값이 없기 때문에 속성 필드 값중 하나인 merged를 이용하려고 하는데 이 값을 소멸지수데이터와 연결시켜주는 매개변수로 featureidkey 를 사용합니다.

<python />
fig = px.choropleth_mapbox(df, geojson=state_geo1, locations='sigun_code', color='소멸위험지수', color_continuous_scale="matter", range_color=(0, 2), mapbox_style="carto-positron", featureidkey="properties.merged", zoom=6, center = {"lat": 37.565, "lon": 126.986}, opacity=0.5, labels={'소멸위험지수':'지자체별 소멸위험지수'} ) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()

Choropleth map using plotly.graph_objects and carto base map

carto base map을 이용해서 지도 시각화를 하려고 합니다.

<python />
import plotly.graph_objects as go fig = go.Figure(go.Choroplethmapbox( geojson=state_geo1, locations=df.sigun_code, z=df['소멸위험지수'], featureidkey = 'properties.merged', colorscale="Viridis", zmin=0, zmax=2, marker_opacity=0.5, marker_line_width=0)) fig.update_layout(mapbox_style="carto-positron", mapbox_zoom=6, mapbox_center = {"lat": 35.565, "lon": 127.986}) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()

Choropleth map using plotly.graph_objects and open-street-map

open-street-map 을 사용하면 folium으로 지도시각화 한 것과 비슷한 형태의 지도가 나타납니다.

<python />
import plotly.graph_objects as go fig = go.Figure(go.Choroplethmapbox( geojson=state_geo1, locations=df.sigun_code, z=df['소멸위험지수'], featureidkey = 'properties.merged', colorscale="Viridis", zmin=0, zmax=2, marker_opacity=0.5, marker_line_width=0)) fig.update_layout(mapbox_style="open-street-map", mapbox_zoom=6, mapbox_center = {"lat": 35.565, "lon": 127.986}) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()

Mapbox Light base map

Mapbox의 api 값을 이용하여 Light base map 지도 시각화를 하려고 합니다.

https://www.mapbox.com/  사이트에 들어가서 계정을 생성하고 account에 들어가면 본인의 token값에 대해 확인할 수 있습니다.

<python />
token = '개인 Mapbox 토큰 키값 '
<python />
import plotly.graph_objects as go fig = go.Figure(go.Choroplethmapbox( geojson=state_geo1, locations=df.sigun_code, z=df['소멸위험지수'], featureidkey = 'properties.merged', colorscale="Viridis", zmin=0, zmax=2, marker_opacity=0.5, marker_line_width=0)) fig.update_layout(mapbox_style="light", mapbox_accesstoken=token, mapbox_zoom=3, mapbox_center = {"lat": 35.565, "lon": 127.986}) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()

Choropleth Map은 지리 영역별 데이터 수치 값을 색으로 표현한 지도 시각화 유형입니다

plotly는 사용자 정의 구성 및 스타일을 포함하여 사용 가능한 다양한 시각화 구현을 가능하게 합니다.

지도 시각화를 하는데 있어서 다양한 방법들이 있는데 데이터에 알맞은 시각화 방법으로 데이터 분석 시 좋은 인사이트를 창출할것같습니다.

profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!