(11주차) 11월22일
folium
- 강의영상
- import
- folium.Map
- folium.Marker
- folium.CircleMarker
- plugins.HeatMap
- plugins.HeatMapWithTime
- 예제: earthquakes
-
(1/7) Map object (1)
-
(2/7) Map object (2)
-
(3/7) Marker (1)
-
(4/7) Marker (2)
-
(5/7) flugins (1)
-
(6/7) flugins (2)
-
(7/7) 지진자료시각화
import numpy as np
import pandas as pd
import folium
-
global view
m=folium.Map(scrollWheelZoom=False)
#m
-
location과 scale을 조정하는 방법
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=16)
#m
-
tiles
옵션을 주어서 지도의 외형을 변경하여 보자.
- "OpenStreetMap"
- "Stamen Terrain", "Stamen Toner", "Stamen Watercolor"
- "CartoDB positron", "CartoDB dark_matter"
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=15,
tiles="CartoDB positron")
#m
-
지도위에 무엇인가 오브젝트를 추가하는데, 가장 기본적인 것이 마커임 (점이라 생각해도 괜찮음)
-
마커안에 내용을 넣을 수 있음. (경우에 따라서는 유용하다)
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=14,
tiles="CartoDB positron")
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup='JBNU',
icon=folium.Icon(color='red',icon='university',prefix='fa')
).add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='HOME'
).add_to(m)
#m
-
조금 더 다양한 아이콘들을 추가하여 보자.
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=14,
tiles="CartoDB positron")
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup='JBNU',
icon=folium.Icon(color='red',icon='music',prefix='fa')
).add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='HOME'
).add_to(m)
#m
-
icon='university'
대신에 쓸만한 옵션들
- icon='street-view'
- icon='tree'
- icon='plane'
- icon='bell'
- ...
-
마커에 HTML넣기
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=14,
tiles="CartoDB positron")
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup='<h2> JBNU </h2><br>',
icon=folium.Icon(color='red',icon='music',prefix='fa')
).add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='<h5> HOME </h5><br>'
).add_to(m)
#m
-
마커에 DataFrame (을 HTML로 바꿔서) 넣기
df= pd.DataFrame(data=[[2019,35],[2020,35],[2021,33]],columns=['Year','Enrollment'])
df.to_html()
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=14,
tiles="CartoDB positron")
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup='<h2> JBNU </h2><br>'+df.to_html(),
icon=folium.Icon(color='red',icon='music',prefix='fa')
).add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='<h5> HOME </h5><br>'
).add_to(m)
#m
-
논리구조상 HTML 오브젝트를 아무거나 넣을 수 있다. $\to$ 그림도 넣을 수 있나?
import base64
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([1,2,3,4],[2,3,4,3],'o--r')
fig.savefig('temp.png')
_encoded = base64.b64encode(open('temp.png','rb').read())
_myhtml = '<img src="data:image/png;base64,{}">'.format
_iframe = folium.IFrame(_myhtml(_encoded.decode('UTF-8')),width=400,height=300)
_popup = folium.Popup(_iframe)
- 인터넷에서 긁어온 코드
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=13,
tiles="CartoDB positron"
)
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup=_popup,
icon=folium.Icon(color='red',icon='music',prefix='fa')
).add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='<h5> HOME </h5><br>'
).add_to(m)
#m
m=folium.Map(scrollWheelZoom=False,
location=[35.84676618432067, 127.12936405235232],
zoom_start=13,
tiles="CartoDB positron")
folium.Marker(location=[35.84676618432067, 127.12936405235232],
#tooltip='Click me',
popup=_popup,
icon=folium.Icon(color='red',icon='music',prefix='fa')
).add_to(m)
folium.CircleMarker(location=[35.84676618432067, 127.12936405235232],
radius=40,
color=None,
fill=True,
fill_color='red',
popup='JBNU').add_to(m)
folium.Marker(location=[35.837688889992634, 127.11212714586104],
#tooltip='Click me',
popup='<h5> HOME </h5><br>'
).add_to(m)
#m
-
다양한 마커를 그냥 지옴처럼 생각해도 괜찮아보임
-
동그라미 하나 그리는데 너무 많이 노력을 하는것 같기도 함.
-
Circle이 아니라 라인, 사각형, 폴리곤등도 지도에 추가할수 있으나 더 많은 노력이 필요하다.
-
Heatmap은 폴리움에서 데이터 시각화를 하기에 적합한 기본도구임
from folium import plugins
data=(np.random.normal(size=(100,3)) + np.array([[28,77,5]])).tolist()
m=folium.Map([28,77],zoom_start=6,scrollWheelZoom=False)
plugins.HeatMap(data).add_to(m)
#m
-
입자의 위치
단 $(x_0,y_0)=(35.837688889992634, 127.11212714586104)$ 라고 하고 $\epsilon_t$와 $\eta_t$는 서로 독립인 정규분포이다.
- 최종적인 차원: 프레임수 점의수 2
t0 = np.array([[35.837688889992634,127.11212714586104]]*3000)
walk = np.random.normal(size=(200,3000,2)) * 0.0001
t0 # 시점0
t0+walk[0,:,:]# 시점1
t0+walk[0,:,:]+walk[1,:,:]# 시점2
-
그런데 walk[0,:,:]+walk[1,:,:]
를 좀더 간단하게 쓸수 있다.
walk[0,:,:]+walk[1,:,:]
walk[:2,:,:].sum(axis=0)
-
따라서 시점2는 아래와 같이 표현가능
t0+walk[:2,:,:].sum(axis=0)
-
그렇다면 시점3은?
t0+walk[:3,:,:].sum(axis=0)
-
따라서 data 는
data = [(t0+walk[:i,:,:].sum(axis=0)).tolist() for i in range(200)]
np.array(data).shape
-
이제 data[0], data[1], data[2], ... data[199]까지 대입하여 각각 그림을 그리고 시각화하면 된다.
m=folium.Map(scrollWheelZoom=False,
location=[35.837688889992634,127.11212714586104],
zoom_start=16)
plugins.HeatMapWithTime(data,radius=5).add_to(m)
#m
- 가스의 확산과정
df=pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/earthquakes-23k.csv')
df
lst=[df.assign(Year=list(map(lambda x: x.split('/')[-1], df.Date))).\
groupby('Year').\
pipe(list)[i][1].iloc[:,[1,2,3]].\
to_numpy().tolist() for i in range(2017-1965)]
m=folium.Map(scrollWheelZoom=False)
plugins.HeatMapWithTime(lst,radius=5,index=list(range(1965,2017))).add_to(m)
#m
-
숙제:
지진자료에서 1985년 이후의 자료만 고른뒤에 HeatMapWithTime()을 이용하여 시각화하라.