folium은 다양한 형태의 Leaflet 지도를 손쉽게 생성할 수 있는 매우 강력한 파이썬 라이브러리입니다. Leaflet/folium 기반 지도는 인터랙티브하게 동작하기 때문에 대시보드 제작에 특히 유용합니다.
설치 방법
pip를 이용하면 folium을 아주 간단하게 설치할 수 있습니다.
$pip install folium
아래 스크린샷에서 확인할 수 있듯이, 콘솔(cmd) 창에 위 명령어만 입력하면 pip가 folium과 함께 필요한 의존성 패키지들까지 자동으로 설치해 줍니다.

기본 지도 만들기
# 라이브러리 임포트
import folium
# 위치는 위도(lat) → 경도(lon) 순서로 입력합니다.
# zoom_start는 확대 수준을 의미하며, 숫자가 클수록 더 가까이 확대됩니다.
mapOBJ = folium.Map(location=[17.3616, 78.4747], zoom_start=4, tiles='Stamen Terrain')
# Map 객체의 save 메서드를 호출하면 지도가 담긴 HTML 파일이 생성됩니다.
mapOBJ.save('map2.html')
실행 결과

예제 2: GeoJson 데이터 시각화
GeoJson 형식의 데이터를 지도 위에 바로 렌더링할 수도 있습니다. 아래 예제는 무작위로 생성한 좌표들을 MultiPoint 피처로 지도에 표시합니다.
import folium
import os
from folium import features
import numpy as np
import pandas as pd
N = 1000
lons = +5 - np.random.normal(size=N)
lats = 48 - np.random.normal(size=N)
data = {
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'geometry': {
'type': 'MultiPoint',
'coordinates': [[lon, lat] for (lat, lon) in zip(lats, lons)],
},
'properties': {'prop0': 'value0'}
},
],
}
m = folium.Map([17.3616, 78.4747], zoom_start=10)
m.add_child(features.GeoJson(data))
m.save('Features.html')
실행 결과

예제 3: 마커, 아이콘, 팝업 추가하기
특정 위치에 마커를 배치하고, 색상 아이콘과 클릭 시 열리는 팝업을 함께 추가할 수 있습니다.
import folium
from folium import features
m = folium.Map([17.3616, 78.4747], zoom_start=15)
mk = features.Marker([17.3616, 78.4747])
pp = folium.Popup('Charminar')
ic = features.Icon(color='red')
mk.add_child(ic)
mk.add_child(pp)
m.add_child(mk)
m.save('Features_1.html')
실행 결과

예제 4: vincent를 활용한 차트 팝업 만들기
이번에는 vincent라는 새로운 라이브러리를 사용해 보겠습니다. vincent는 파이썬의 데이터 구조(튜플, 리스트, 딕셔너리, Pandas DataFrame 등)를 Vega 시각화 문법으로 변환해 주는 도구로, 지도 팝업 안에 차트를 삽입할 때 유용하게 활용됩니다.
vincent 역시 pip 명령어 한 줄로 간단히 설치할 수 있습니다.
$pip install vincent
C:\WINDOWS\system32>pip install vincent Collecting vincent Downloading https://files.pythonhosted.org/packages/11/bf/a12ecaa21a2e376a16de67e09f64a38a4acd95e04e5dc35ad2f13a6f0bfd/vincent-0.4.4.tar.gz Requirement already satisfied: pandas in c:\python\python361\lib\site-packages (from vincent) (0.20.2) Requirement already satisfied: pytz >= 2011k in c:\python\python361\lib\site-packages (from pandas -> vincent) (2017.2) Requirement already satisfied: python-dateutil >= 2 in c:\python\python361\lib\site-packages (from python-dateutil -> pandas -> vincent) (2.6.0) Requirement already satisfied: numpy >= 1.7.0 in c:\python\python361\lib\site-packages (from pandas -> vincent) (1.16.0) Requirement already satisfied: six >= 1.5 in c:\python\python361\lib\site-packages (from python-dateutil -> pandas -> vincent) (1.10.0) Building wheels for collected packages: vincent Running setup.py bdist_wheel for vincent ... done Stored in directory: C:\Users\rajesh\AppData\Local\pip\Cache\wheels\4c\0d\8a\65f34c765c6094a71cce3e42a49a26533eef61695e9b505f03 Successfully built vincent Installing collected packages: vincent Successfully installed vincent-0.4.4
아래 코드는 산점도(scatter) 차트를 생성한 뒤, 이를 JSON으로 변환하여 마커의 팝업 안에 Vega 객체로 삽입하는 예제입니다.
import folium
from folium import features
import numpy as np
import json
import vincent
N = 100
multi_iter2 = {
'x': np.random.uniform(size=(N,)),
'y': np.random.uniform(size=(N,)),
}
scatter = vincent.Scatter(multi_iter2, iter_idx='x', height=100, width=200)
data = json.loads(scatter.to_json())
m = folium.Map([17.3616, 78.4747], zoom_start=10)
mk = features.Marker([17.3616, 78.4747])
p = folium.Popup('Charminar')
v = features.Vega(data, width='100%', height='100%')
mk.add_child(p)
p.add_child(v)
m.add_child(mk)
m.save('Features_2.html')
실행 결과
