07_Data_Analysis
05_Folium(지도 시각화 도구)
chuuvelop
2025. 3. 17. 00:39
728x90
Folium
지도 시각화에 유용한 도구
세계 지도를 기본 지원하고 다양한 스타일의 지도 이미지를 제공
지도 만들기
- Map() 함수를 이용하여 지도 객체 생성
- 지도 화면은 줌과 이동 기능을 지원
- folium은 웹 기반 지도를 만들어 웹 기반 IDE에서는 지도 객체를 바로 확인할 수 있고, 웹 기반 IDE가 아니라면 HTML 파일로 저장하고 확인
folium설치
https://python-visualization.github.io/folium/latest/getting_started.html
pip install folium
import pandas as pd
import folium
import json
# 서울 지도 만들기
seoul_map = folium.Map(location = [37.55, 126.98], zoom_start = 12)
seoul_map
# 지도를 html 파일로 저장하기
seoul_map.save("seoul.html")
지도 스타일 적용
- Map() 함수에 tiles 옵션을 적용하여 스타일을 변경할 수 있음
seoul_map2 = folium.Map(location = [37.53, 126.98], tiles = "Cartodb Positron", zoom_start = 12)
seoul_map3 = folium.Map(location = [37.53, 126.98], tiles = "Cartodb dark_matter", zoom_start = 15)
지도에 마커 표시하기
# 0번째 컬럼을 인덱스로 지정 index_col = 0
df = pd.read_excel("./data/서울지역 대학교 위치.xlsx", index_col = 0)
df.head()
# 대학교 위치 정보를 Marker로 표시
for idx, row in df.iterrows():
folium.Marker([row["위도"], row["경도"]], popup = idx).add_to(seoul_map)
seoul_map
지도에 원형 마커 표시
seoul_map = folium.Map(location = [37.55, 126.98], zoom_start = 12)
for idx, row in df.iterrows():
folium.CircleMarker([row["위도"], row["경도"]],
radius = 10, # 원의 반지름
color = "brown", # 원의 둘레 색상
fill = True,
fill_color = "cora", # 원을 채우는 색
fill_opacity = 0.7, # 투명도
popup = idx).add_to(seoul_map)
seoul_map
지도 영역에 단계구분도(Choropleth Map) 표시하기
df = pd.read_excel("./data/경기도인구데이터.xlsx", index_col = "구분")
df.head()
df.columns
Index([2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017], dtype='int64')
df.columns = df.columns.map(str)
df.columns
Index(['2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015',
'2016', '2017'],
dtype='object')
geo_data = json.load(open("./data/경기도행정구역경계.json", encoding = "utf-8"))
geo_data
{'type': 'FeatureCollection',
'features': [{'type': 'Feature',
'properties': {'code': 31380,
'name': '양평군',
'name_eng': 'Yangpyeong-gun',
'base_year': 2013},
'geometry': {'type': 'Polygon',
'coordinates': [[[127.56113535909492, 37.6256560539258],
[127.57290963929243, 37.61087369350498],
[127.56366973908277, 37.5842624297699],
[127.52226606559191, 37.5828628697518],
[127.50048767007603, 37.569036373178626],
[127.47687473909174, 37.574448241913856],
[127.47565866803647, 37.60512112601634],
[127.44699730711024, 37.64497584741164],
[127.4272349102434, 37.66284420898682],
[127.40156700708162, 37.64806970784708],
[127.3732642199939, 37.6453987554284],
[127.3542931884407, 37.6250006376975],
[127.34360057873045, 37.588997440929354],
[127.31002843450217, 37.53523876142835],
[127.30923294884336, 37.5135706079458],
[127.32809611134748, 37.53133849534739],
[127.3663244453597, 37.52716845880826],
[127.38286320755414, 37.50147517965334],
[127.39046783039153, 37.47413422098595],
[127.37490698722792, 37.455072688441305],
[127.39174400683049, 37.4256483411369],
[127.40276739880215, 37.41856433413549],
[127.4250053080982, 37.43669952587185],
[127.4817900304572, 37.42084413829662],
[127.51015267026155, 37.43699555518635],
[127.52501209957308, 37.43192043868044],
[127.53910572062166, 37.40849283821634],
[127.60528700481163, 37.416969769508924],
[127.63754040237271, 37.41065607591271],
[127.6491838950862, 37.402042953108506],
[127.66976823475012, 37.40884431255766],
[127.71071536074867, 37.40736583858037],
[127.70347417929173, 37.371054026073324],
[127.76165381178268, 37.36421926003675],
[127.77952402154285, 37.368441789396854],
[127.80397287036232, 37.432516049235865],
[127.79833492163134, 37.460500237870505],
[127.77664798308412, 37.48883635932707],
[127.77611527652192, 37.50328615763377],
[127.80855972024105, 37.53220450961153],
[127.8445769305193, 37.53621789699497],
[127.85162286006927, 37.55037340096326],
[127.81507964099751, 37.5618389022189],
[127.79492564827493, 37.58252978378627],
[127.76838776707211, 37.580178216134605],
[127.75614914198108, 37.589477424718204],
[127.7102810556826, 37.58360128682645],
[127.69869383868397, 37.59757031454811],
[127.65553070991882, 37.61954565135447],
[127.62972032693943, 37.63983122973888],
[127.60450569091653, 37.648548552427314],
[127.58166701442097, 37.63033393389168],
[127.56113535909492, 37.6256560539258]]]}},
{'type': 'Feature',
'properties': {'code': 31370,
'name': '가평군',
'name_eng': 'Gapyeong-gun',
'base_year': 2013},
'geometry': {'type': 'Polygon',
'coordinates': [[[127.44780328408541, 38.048238751068475],
[127.42042182072485, 38.01200319871128],
[127.41516664705571, 37.995046525366845],
[127.39194666896421, 37.97992649728499],
[127.37828420492166, 37.958773972665476],
[127.3864253692493, 37.940789082655876],
[127.35796486335995, 37.918888706648104],
[127.33112989323685, 37.9192732427266],
[127.32585628843694, 37.8708665787365],
[127.31427495278925, 37.86338279582678],
[127.29023239060183, 37.867156223189305],
[127.27621937205707, 37.823925522993584],
[127.28134774958465, 37.81350552459983],
[127.2686525155809, 37.777676803810074],
[127.32070791913966, 37.76445271893134],
[127.34501289752937, 37.7266690692075],
[127.35759057077398, 37.720909295881434],
[127.35557114419971, 37.701041217064585],
[127.38133544278186, 37.67180837890239],
[127.3732642199939, 37.6453987554284],
[127.40156700708162, 37.64806970784708],
[127.4272349102434, 37.66284420898682],
[127.44699730711024, 37.64497584741164],
[127.47565866803647, 37.60512112601634],
[127.47687473909174, 37.574448241913856],
[127.50048767007603, 37.569036373178626],
[127.52226606559191, 37.5828628697518],
[127.56366973908277, 37.5842624297699],
[127.57290963929243, 37.61087369350498],
[127.56113535909492, 37.6256560539258],
[127.53917031861263, 37.64021056192394],
[127.5549605217701, 37.658757758392326],
[127.55230133599949, 37.6826768602848],
[127.5620152520609, 37.72573118147031],
[127.54295591487076, 37.71630823574417],
[127.50979807707056, 37.72791553253582],
[127.5466892772679, 37.757547899640265],
[127.52374487270039, 37.788564076302706],
[127.53790811514408, 37.806297142430786],
[127.5278056459557, 37.8205934650677],
[127.53467866263196, 37.8391134107185],
[127.5645808687282, 37.852710085354005],
[127.586513542654, 37.87296654527047],
[127.60326048844294, 37.87185797528634],
[127.61988365348992, 37.90376621474279],
[127.61592274592837, 37.93662873141094],
[127.60515472290533, 37.95233960186072],
[127.54648191805605, 37.96536690082484],
[127.54189684816376, 37.99843118565868],
[127.50356426725331, 37.99680815824825],
[127.47430810833019, 38.00331531710267],
[127.46013793737187, 38.01348603532302],
[127.44780328408541, 38.048238751068475]]]}},
...
g_map = folium.Map(location = [37.5502, 126.982], stiles = "Cartodb Positron", zoom_start = 9)
df.head()
df.index
Index(['수원시장안구', '수원시권선구', '수원시팔달구', '수원시영통구', '성남시수정구', '성남시중원구', '성남시분당구',
'의정부시', '안양시만안구', '안양시동안구', '부천시원미구', '부천시소사구', '부천시오정구', '광명시', '평택시',
'동두천시', '안산시상록구', '안산시단원구', '고양시덕양구', '고양시일산동구', '고양시일산서구', '과천시',
'구리시', '남양주시', '오산시', '시흥시', '군포시', '의왕시', '하남시', '용인시처인구', '용인시기흥구',
'용인시수지구', '파주시', '이천시', '안성시', '김포시', '화성시', '광주시', '양주시', '포천시', '여주시',
'연천군', '가평군', '양평군'],
dtype='object', name='구분')
folium.Choropleth(geo_data = geo_data, # 지도 경계
data = df["2017"], # 표시하려는 데이터
fill_color = "YlOrRd", fill_opacity = 0.7, line_opacity = 0.3,
threshold_scale = [10000, 100000, 300000, 500000, 700000],
key_on = "feature.properties.name").add_to(g_map)
<folium.features.Choropleth at 0x2105ecc5bb0>
g_map
728x90