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