1.  Folium 라이브러리

 


 

2. 지도 만들기

🚀  folium 라이브러리의 Map() 함수를 이용하여 지도 객체를 생성
🚀  지도 화면은 고정된 것이 아니고 줌 Zoom 기능과 화면 이동 Scroll이 가능

    ⚡️  folium은 웹 기반 지도를 만들기 때문에  웹 환경에서만 지도를 확인할 수 있음
    ⚡️  지도를 보려면 지도 객체에 save() 메서드를 적용하여 HTML 파일로 저장하고 웹 브라우저에서 파일을 열어서 확인
            ➡️  주피터 노트북에서는 바로 지도 객체를 확인할 수 있음

import folium

# 서울 지도 만들기
# location 옵션에 [위도, 경도] 수치를 입력하면 그 지점을 중심으로 지도를 보여줌
# zoom_start 옵션을 사용하면 화면 확대 비율을 조절할 수 있음
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)
seoul_map

# 지도를 HTML 파일로 저장하기
seoul_map.save('../output/seoul.html')

 


 

3. 지도 스타일 적용하기

🚀  Map() 함수에 tiles 옵션을 적용하면 지도에 적용하는 스타일을 변경하여 지정할 수 있다

🚀  tiles 스타일 종류

    → tiles = 'OpenStreetMap' (기본값)
    → tiles = 'Cartodb Positron' or 'cartodbpositron' (단계 구분도가 잘 표현 되도록 밝은 색으로 바꿈)

    → tiles = 'Cartodb dark_matter' (지도 색상을 다크모드로 지정)

import folium

seoul_map2 = folium.Map(location=[37.55, 126.98], zoom_start=15, tiles='Cartodb Positron')
seoul_map2

 


 

4. 지도 마커 (Marker) 표시하기

 

📌  서울 시내 주요 대학교의 위치 데이터를 데이터 프레임으로 변환하고, folium 지도에 위치를 표시

import pandas as pd
import folium

# 대학교 리스트를 데이터프레임 변환
df = pd.read_excel('../input/서울지역 대학교 위치.xlsx')
'''
           name         위도          경도
0  KAIST 서울캠퍼스   37.592573  127.046737
1         KC대학교  37.548345  126.854797
2  가톨릭대학교(성신교정)  37.585922  127.004328
3  가톨릭대학교(성의교정)  37.499623  127.006065
4      감리교신학대학교  37.567645  126.961610
'''

# 서울 지도 만들기
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)

# 대학교 위치정보를 Marker로 표시
for name, lat, lng in zip(df['name'], df['위도'], df['경도']):
    folium.Marker([lat, lng], popup=name).add_to(seoul_map)
seoul_map

 

⚡️ folium.Marker() 함수의 인수

  • [위도, 경도] 는 마커를 찍을 좌표
  • popup = '클릭문구' 는 마우스 클릭시 표시되는 문구
  • tooltip = '오버문구' 는 마우스를 갖다 놓으면 표시되는 문구
  • icon = folium.Icon(color='red', icon='star') 은 아이콘의 색상과 모양을 설정
  • add_to(m) 은 설정한 모든 내용을 현재 지도에 적용하라는 의미

출력 결과


# 지도를 HTML 파일로 저장하기
seoul_map.save('../output/seoul_colleges.html')

 


💡 대학교 위치정보를 CircleMarker()로 표시
      -  Marker() 대신 CircleMarker()를 사용. 원형 마커의 크기, 색상, 투명도 들을 설정할 수 있음

for name, lat, lng in zip(df['name'], df['위도'], df['경도']):
    folium.CircleMarker([lat, lng], popup=name,
                        radius=10,     # 원의 반지름
                        color='brown', # 원의 둘레 색상
                        fill=True,
                        fill_color='coral', # 원을 채우는 색
                        fill_opacity=0.7  # 투명도
                        ).add_to(seoul_map)
seoul_map

출력 결과

 


 

5.  단계 구분도 Choropleth Map 표시

🚀  행정구역과 같이 지도 상의 어떤 경계에 둘러싸인 영역에 색을 칠하거나 음영 등으로 정보를 나타내는 시각화 방법

🚀  전달하는 정보의 값이 커지면 영역에 칠해진 색이나 음영이 진해짐

 

import json
import pandas as pd
import folium

# 경기도 인구변화 데이터를 불러와서 데이터프레임으로 변환
# 경기도 지역의 시군구별 인구변화 데이터 (2007 ~ 2017)
df = pd.read_excel('../input/경기도인구데이터.xlsx', index_col='구분')
df.head()
'''
          2007    2008    2009    2010    2011    2012    2013    2014  \
구분                                                                       
수원시장안구  287474  285803  290798  293692  290999  291757  300908  301196   
수원시권선구  310553  308177  304097  306783  321176  332633  331773  339835   
수원시팔달구  216945  213235  219833  216503  209772  206794  204805  203479   
수원시영통구  252730  260210  258421  260557  266542  289074  310671  329718   
성남시수정구  256744  248452  242161  241070  236123  233997  228167  223539   

          2015    2016    2017  
구분                              
수원시장안구  299016  296479  293828  
수원시권선구  351053  358393  365653  
수원시팔달구  199180  198515  193311  
수원시영통구  335375  340654  349836  
성남시수정구  219531  232841  236932  
'''

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
Index: 44 entries, 수원시장안구 to 양평군
Data columns (total 11 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   2007    44 non-null     int64
 1   2008    44 non-null     int64
 2   2009    44 non-null     int64
 3   2010    44 non-null     int64
 4   2011    44 non-null     int64
 5   2012    44 non-null     int64
 6   2013    44 non-null     int64
 7   2014    44 non-null     int64
 8   2015    44 non-null     int64
 9   2016    44 non-null     int64
 10  2017    44 non-null     int64
dtypes: int64(11)
memory usage: 4.1+ KB
'''

# int -> str 타입 변경
df.columns = df.columns.map(str)

# 경기도 시군구 경계 정보를 가진 geo-json 파일 불러오기
# 경기도 행정구역 경계 지리 정보를 사용

geo_path = '../input/경기도행정구역경계.json'
geo_data = json.load(open(geo_path))
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],
 '''생략'''
 '''

# 경기도 지도 만들기
g_map = folium.Map(location=[37.5502, 126.982], zoom_start=9)
g_map

출력 결과


# 출력할 연도 선택 (2007 ~ 2017년 중에서 선택)
year = '2017'

# Choropleth 클래스로 단계구분도 표시하기
folium.Choropleth(geo_data=geo_path,  # 지도 경계
                  data=df[year],  # 표시하려는 데이터
                  columns=[df.index, df[year]],  # 열 지정
                  fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.5,
                  threshold_scale=[10000, 100000, 300000, 500000, 700000],
                  # -> 임계값 수치, 10000명/100000명...
                  key_on='feature.properties.name'
                  ).add_to(g_map)
g_map

  📌  geo_data : Choropleth 맵에 사용될 지리 정보

  📌  key_on : geo_data 내용에서 지리 영역을 구분할 열 이름 호출 ( ex. '양평군', '이천시'...)

  📌  data : 추출한 DataFrame에서 Choropleth 맵에 사용될 데이터 

  📌  columns : 추출한 DataFrame에서 데이터로 사용될 열 이름

 

출력 결과

 

 

 

 

 

[ 내용 참고: IT 학원 강의 ]

+ Recent posts