[folium 라이브러리] 지도 시각화하기, 지도에 텍스트 넣기

hh_mon__a·2024년 6월 5일
0

python

목록 보기
1/3
post-thumbnail

1. 라이브러리 불러오기

import pandas as pd
import numpy as np
import json
import seaborn as sns
import matplotlib.pyplot as plt
import geopandas as gpd
import folium
plt.rcParams['font.family'] = 'NanumGothic' # NanumGothic
pd.options.display.float_format = '{:.5f}'.format

2. 지도데이터 불러오기

대한민국 최신 행정구역(SHP) 다운로드 페이지

  • 시군구 데이터를 다운받음
sigungu = gpd.read_file('/데이터경로/SIG_20221119/sig.shp', encoding='cp949')
sigungu.geometry = sigungu.geometry.set_crs("EPSG:5179")
sigungu = sigungu.to_crs("EPSG:4326")
  • 위의 데이터는 좌표계가 5179라 우리가 사용하는 위경도인 4326으로 변경해줘야 함
  • 이 데이터는 시도는 안나와서 sig_cd인 행정동코드를 확인해서 원하는 지역의 데이터를 뽑아야 함

3. 충청남도 데이터 추출 및 새로운 열 생성

  • 행정동코드(SIG_CD) 앞자리 2개가 시도를 나타냄
  • 충청남도가 필요해서 SIG_CD가 44인 경우를 뽑음
cn = sigungu[sigungu['SIG_CD'].str[:2] == "44"]
cn['인구'] = np.random.randint(0,100, size=len(cn))
  • 시각화를 위해 새로운 열인 인구 생성

4. folium으로 지도 시각화

  • 먼저 geodataframe(cn)을 json형식으로 변경해야함
    geojson_data = json.loads(cn.to_json())
# 충남시청으로 중심잡음
center = [36.3278846883893, 127.418923240036] 

# 기본 지도
m = folium.Map(location=center, zoom_start=10)

# 지도에 인구 수 비율만큼 색상 채우기
folium.Choropleth(
    geo_data=geojson_data, # json 형식
    data=cn, # 시각화할 데이터
    columns=['SIG_KOR_NM','인구'], # 사용할 데이터
    key_on='feature.properties.SIG_KOR_NM',
    fill_color='Blues', # 색 지정
    fill_opacity=0.7, 
    line_opacity=0.2,
    legend_name='인구 수',
).add_to(m)
  • key_on : json 파일 내의 특정 속성과 데이터의 키(key_on)를 매칭하여 시각화에 사용할 지리적 경계를 지정하는 역할
  • fill_opacity : 채우기 색상 투명도
  • line_opacity : 경계선 색상 투명도
  • 시각화 결과

5. 각 구역의 중심에 이름 추가

for index, row in cn.iterrows():
	# 각 구역 중심 지정
    centroid = [row.geometry.centroid.y, row.geometry.centroid.x]
    name = row['SIG_KOR_NM']
    
    # 텍스트 레이블 추가
    folium.map.Marker(
        location=centroid,
        icon=folium.DivIcon(
            icon_size=(150,36),
            icon_anchor=(7,20),
            html=f'<div style="font-size: 12pt">{name}</div>'
        )
    ).add_to(m)
  • 시각화 결과
profile
데이터분석/데이터사이언스/코딩

0개의 댓글