- import
import folium
- 위경도를 이용한 지도 보기
m = folium.Map(location = [37.222195, 127.187617], zoom_start = 15)
m
(명지대학교 위치)
- json 데이터를 사용하여 시각화
import requests
# 미국 지도 그리기
m = folium.Map([43, -100], zoom_start=4)
us_states = requests.get(
"https://raw.githubusercontent.com/python-visualization/folium-example-data/main/us_states.json"
).json()
# Choropleth 이용 (지역별로 색을 달리하는데 이용된다.)
folium.Choropleth(
geo_data=us_states, #data 넣기
fill_opacity=0.3, #색투명도
line_weight=2, #경계선의 두께설정
).add_to(m)
m
실제 데이터를 이용하여 시각화 해보자 이때 주의해야할 건 json파일을 이용할때의 key_on 값이다.
import pandas as pd
import folium
import matplotlib.pyplot as plt
# 미리 만들어둔 데이터를 불러옵니다.
df = pd.read_csv('my_path/지도데이터/older.csv', encoding='UTF8' )
# 해당 geojson 파일에서의 key값을 잘 살펴보아야함
geo_data = ''my_path/지도데이터/seoul-dong.geojson
df.head()
seoul-dong.geojson 파일의 일부 형태
{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "시": "서울특별시", "구": "종로구", "동": "사직동", "행정동코드": 11110530 },
"geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 126.976888842748167, 37.575650779448786 ],
[ 126.977034498877501, 37.569194530054546 ], [ 126.975974728212492, 37.569336299425764 ],
[ 126.975374709912543, 37.569315567021562 ], [ 126.974331935623255, 37.569261800517531 ],
[ 126.969048370018541, 37.568194417708327 ], [ 126.968544936033837, 37.568427679612761 ],
[ 126.966649959821197, 37.569491655206576 ], [ 126.966281750244846, 37.569700734798701 ],
[ 126.966097327080405, 37.569856509723699 ], [ 126.965728529225771, 37.570183936115114 ],
[ 126.965926998221278, 37.570318805686199 ], [ 126.96601094018429, 37.57154839557748 ],
[ 126.963659220521961, 37.575174660660366 ], [ 126.963086004345101, 37.576485920015543 ],
[ 126.962840990511978, 37.57666158609274 ], [ 126.962810410472628, 37.579448809656768 ],
[ 126.967424315843317, 37.579601537124489 ], [ 126.967421763026508, 37.579263521441646 ],
[ 126.967430060184597, 37.579192577998612 ], [ 126.967457090095607, 37.578975250585444 ],
[ 126.968066046996256, 37.578246780467872 ], [ 126.968955116954774, 37.57793526234029 ],
[ 126.969212842969057, 37.577935299309388 ], [ 126.969414538865792, 37.578121124142179 ],
[ 126.969664426694706, 37.578531136682209 ], [ 126.969667219148718, 37.578736205134923 ],
[ 126.969668773533087, 37.578992879009881 ], [ 126.969669499103631, 37.579112526749597 ],
[ 126.969904573616262, 37.579301753628727 ], [ 126.97135197544759, 37.57951327793981 ],
[ 126.973819257844539, 37.579372140302631 ], [ 126.973917363383421, 37.578487073041011 ],
[ 126.973939619980882, 37.578240429978088 ], [ 126.974331538357575, 37.575749906299862 ],
[ 126.975803789978045, 37.575649468824203 ], [ 126.976888842748167, 37.575650779448786 ] ] ] ] } },
이때 필요한 위 경도에 따라 key_on 값을 'features.properties.동'과 같이 할 수 있다.
예시 코드
#위경도 값
center = [37.541, 126.986]
# 맵이 center 에 위치하고, zoom 레벨은 10로 시작하는 맵 m을 만듭니다.
m1 = folium.Map(location=center, zoom_start=10)
# Choropleth 레이어를 만들고, 맵 m에 추가합니다.
# geo_data부분은 json파일 이용
# data = DataFrame
# columns부분은 data의 컬럼값
# key_on 은 json 파일에서의 위경도 값을 가지고 있는 컬럼 부분
# legend_name 범례 이름
folium.Choropleth( geo_data=geo_data, data=df, columns=('동', '인구'),
key_on='feature.properties.동',
fill_color='BuPu',
legend_name='노령 인구수' ).add_to(m1)
# m1 html로 저장
m1.save('age.html')
m1
- 지도 데이터를 시각화 하기 위한 전처리
df=pd.read_csv('/my_path/지도데이터/강원도지진계.csv',encoding='cp949')
df
사용할 컬럼들만 보기
df2 = df[['관측소명','관측기관', '소재지지번주소', '위도(WGS84좌표)', '경도(WGS84좌표)']]
df2
시에서 관측한 것만 뽑자
df4 = df2[df2['관측기관'].str.contains('시')]
df4
지도 생성
map_osm = folium.Map(location=[38.011952, 128.542213], zoom_start=10)
map_osm
for 문을 이용한 마커 찍기
for i in df4.index:
# 행 우선 접근 방식으로 값 추출하기
name = df4.loc[i, '관측소명']
lat = df4.loc[i, '위도(WGS84좌표)']
lng = df4.loc[i, '경도(WGS84좌표)']
# 추출한 정보를 지도에 표시
marker= folium.Marker([lat,lng], popup=name).add_to(map_osm)
map_osm
- point 찍기
df = pd.read_csv('/my_path/지도데이터/toilet.csv')
df = df[['고유번호', '위도', '경도']]
center = [37.541, 126.986]
m = folium.Map(location=center, zoom_start=10) # 1000 개의 데이터만 그려냅니다.
for i in df.index[:1000]:
folium.CircleMarker( location = [df.loc[i, ['위도']][0],df.loc[i, ['경도']][0]], tooltip = df.loc[i, '고유번호'], radius = 2 ).add_to(m)
m
- bounds 박스
center = [37.541, 126.986]
m = folium.Map(location=center, zoom_start=14)
kw = {
"color": "blue",
"line_cap": "round",
"fill": True,
"fill_color": "red",
"weight": 5,
"popup": "Tokyo, Japan",
"tooltip": "<strong>Click me!</strong>",
}
folium.Rectangle(
bounds=[[37.541, 126.986], [37.531, 126.996]],
line_join="round",
dash_array="5, 5",
**kw,
).add_to(m)
m
이정도만 하고 사실 해당 부분은 str. 을 이용한 전처리가 더 중요하기 때문에 관련 함수를 적어 두겠다.
문저열 검사 관련 함수
- .str.contains(pat): 특정 패턴이나 문자열이 포함되어 있는지 확인.
- .str.startswith(pat): 문자열이 특정 패턴으로 시작하는지 확인.
- .str.endswith(pat): 문자열이 특정 패턴으로 끝나는지 확인.
- .str.isnumeric(): 문자열이 숫자로만 이루어져 있는지 확인.
- .str.isdigit(): 문자열이 숫자(정수)로만 이루어져 있는지 확인.
- .str.isalpha(): 문자열이 알파벳으로만 이루어져 있는지 확인.
- .str.isalnum(): 문자열이 알파벳 또는 숫자로 이루어져 있는지 확인.
- .str.isspace(): 문자열이 공백으로만 이루어져 있는지 확인.
- .str.islower(): 문자열이 모두 소문자인지 확인.
- .str.isupper(): 문자열이 모두 대문자인지 확인.
- .str.len(): 문자열의 길이를 반환.
문자열 변환 관련 함수
- .str.lower(): 문자열을 모두 소문자로 변환.
- .str.upper(): 문자열을 모두 대문자로 변환.
- .str.capitalize(): 문자열의 첫 글자만 대문자로 변환.
- .str.title(): 각 단어의 첫 글자를 대문자로 변환.
- .str.swapcase(): 대문자는 소문자로, 소문자는 대문자로 변환.
문자열 치환 및 수정 관련 함수
- .str.strip(): 문자열의 양쪽 공백 제거.
- .str.lstrip(): 문자열의 왼쪽 공백 제거.
- .str.rstrip(): 문자열의 오른쪽 공백 제거.
- .str.pad(width): 문자열의 길이를 지정된 길이로 패딩.
- .str.zfill(width): 문자열을 왼쪽에 0을 추가하여 지정된 길이로 패딩.
- .str.replace(pat, repl): 특정 문자열이나 패턴을 다른 값으로 치환.
- .str.remove(pat): 특정 패턴 제거. (.replace(pat, '')와 동일)
- .str.repeat(n): 문자열을 n번 반복.
- .str.slice(start, stop): 특정 위치의 문자열 잘라내기.
문자열 분리 및 결합 함수
- .str.split(pat): 특정 패턴을 기준으로 문자열 분리.
- .str.rsplit(pat): 오른쪽부터 분리.
- .str.join(sep): 문자열을 특정 구분자로 연결.
- .str.partition(sep): 문자열을 구분자로 나누어 3개의 부분으로 반환.
- .str.rpartition(sep): 오른쪽에서부터 나누어 반환.