저번 글에 이어서 이번에는 Folium을 이용해 시각화하는 코드를 보여줄 것이다.
Folium은 지도에 좌표를 찍고 싶거나 데이터를 지도 위에 표현하고 싶을 때 편하게 쓸 수 있다.
Folium을 쓰기 위해서는 좌표가 필요하다.
지도 위에 직접 표시를 하는 것이므로 정확히 어느 곳에 시각화를 할지 좌표로 찍어주어야한다.
가지고 있는 데이터가 위도, 경도는 없고 어느 지역 이름이나 특정 건물 이름만 있는 경우에 직접 위도, 경도를 구해야한다.
그 좌표를 구해주는 사이트가 있다. Kakao에서 제공하는 Kakao developers이다.
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
위 링크에 들어가서 로그인을 하면 위에 내 어플리케이션이 보인다.
어플리케이션이 없다면 추가를 해주면 API Key를 바로 쓸 수 있게 보기 좋게 보여준다.
그런데 이 Key를 이용해 코드를 알맞게 작성하였는데도 함수가 실행이 안되는 때가 있다.
그때는 어플리케이션 페이지를 좀 내리면 허용 IP 주소가 있다. 이 것을 클릭하여 자신의 IP 주소를 입력해주어야한다.
만약에 IP가 다른 곳에서 작업을 하면 또 IP를 입력해주어야한다.
번거롭긴하지만 자주 사용하는 IP를 미리 입력해두면 크게 불편하진 않다.
위 과정을 진행하고 나면 이제 코드를 짜야한다.
import pandas as pd
station = ["강남역", "서울역", "고속터미널역"]
place = pd.DataFrame(columns = ['역', 'x', 'y'])
for i in station:
url = "https://dapi.kakao.com/v2/local/search/keyword.json?query=" + i
headers = {"Authorization" : "KakaoAK 발급받은 REST API 키"}
places = requests.get(url, headers = headers).json()["documents"][0]
place_name = places["place_name"]
x = float(places["x"])
y = float(places["y"])
place.loc[i] = [place_name, y, x]
place
먼저, 좌표를 뽑아서 저장할 데이터프레임을 만들어주었다.
그리고 역하나씩 좌표를 뽑는다. url은 내가 단어를 검색했을 때의 검색결과라고 생각하면 될 것 같다.
headers는 위에서 발급받은 REST API 키를 넣어주면 되는 것이다.
requests.get 함수를 사용해서 documents를 확인해보면 굉장히 여러 결과가 나온다. 그중에서 나는 첫번째 결과만 보기 위해 첫번째 요소를 지정해주었다.
그리고 장소이름뿐만아니라 장소에 대한 여러가지 정보가 나온다. 필요한 정보를 뽑아서 데이터프레임으로 저장할 수 있다.
place_name은 정확한 장소 명칭이고, x, y는 경도와 위도이다. float를 해주는 이유는 경도와 위도가 str로 나온다. 그래서 바꿔주어야 Folium을 쓰기 쉽다.
이렇게 코드를 짜주면 결과는 아래와 같이 나온다.
그리고 이제 사용할 코드를 짠다.
import folium
place.index = place["역"]
place = place.drop(["역"], axis = 1)
center = [place.mean()[0], place.mean()[1]]
m = folium.Map(location = center, zoom_start = 12)
location_data = place.values.tolist()
folium.PolyLine(locations = location_data, tooltip = "Polyline", color= "red").add_to(m)
m
# m.save("cluster 0.html")
일단 데이터 프레임 형식을 변경해주어야한다.
그 이유는 위도와 경도만 사용할 예정이기 때문이다.
역 이름을 열에서 index로 변경해준다.
그리고 위도의 평균, 경도의 평균을 낸다. center을 지정해준 이유는 점을 찍었을 때 어느 한 쪽으로 치우치지 않고 딱 점 찍어둔 곳만 보일 수 있도록 하기 위해 가장 가운데 점을 기준으로 삼은 것이다.
folium.Map 함수를 이용해 지도를 먼저 그린다. location은 어디를 기준으로 지도를 보여줄 것인지를 묻는 것이다. 아까 center를 기준으로 보여준다고 했으므로 center을 지정해주었다. zoom_start는 처음 지도를 보여줄 때 어디까지 확대를 하고 어디까지 축소를 할 것인지 지정하는 것이다. 상황에 맞게 지정해주면 된다.
그리고 지금 그릴 것은 좌표를 찍는 건 아니고 line을 그릴 것이다. 좌표들을 순서대로 이어주는 것이다.
save 함수는 png는 움직이지 못하므로 저장할 수 없다. 그래서 html로 저장을 하기 위해 작성해뒀던 것이다. 그닥 유용하게 쓰진 못했었다.
내가 그린 지도의 결과물이다.
장소를 그냥 아무곳이나 3곳 찍었던 거라 보기가 좋진 않다.
색을 빨간색만 쓸 수 있는 건 아니고 PolyLine 함수에 color이라는 파라미터가 있다고 한다. 그걸로 지정해줘도 되고, 나는 사용해보진 않았지만 ColorLine이라는 함수도 있다고 하니 필요한 사람은 찾아서 써보면 될 것 같다.
저렇게 선으로 그릴 수도 있지만 좌표를 딱 찍을 수도 있다.
place = place.reset_index()
place = place.rename(columns = {"index" : "역"})
m = folium.Map(location=center, tiles='openstreetmap', zoom_start=13)
for _, i in place.iterrows():
folium.Marker(location = [i["x"], i["y"]], popup = i["역"],
icon = folium.Icon(color = "red")).add_to(m)
m
아까 place의 역 이름을 index로 만들었었다.
좌표 찍을 땐 이것을 다시 열로 돌려줘야한다. 그 이유는 좌표 찍고 이게 무슨 장소인지 알려줘야하기 때문에 열로 다시 돌려주어야한다.
똑같이 folium.Map을 사용해 지도를 나타내는데 이번엔 다른 tiles를 지정해보았다. tiles 파라미터는 지도 표현 방법이다. folium의 지도들도 종류가 있다. 원하는 스타일에 맞춰 지정해주면 된다.
좌표는 라인과 다르게 하나씩 지정을 해줘야한다. 좌표 함수는 Marker이다.
그리고 icon은 밑에 보이는 빨간색 아이콘을 말한다. 색은 red로 해주었다.
코드를 실행하면 위와 같이 보인다. 빨간색을 클릭하면 위와 같이 장소 이름을 보여주기도 한다.
place["s"] = [1000.0, 2000.0, 3000.0]
m = folium.Map(location=center, zoom_start=13)
folium.Circle(location = [place.x[0], place.y[0]], popup = place.역[0],radius = place.s[0],color = "red", fill = "red").add_to(m)
folium.Circle(location = [place.x[1], place.y[1]], popup = place.역[1],radius = place.s[1],color = "red", fill = "red").add_to(m)
folium.Circle(location = [place.x[2], place.y[2]], popup = place.역[2],radius = place.s[2],color = "red", fill = "red").add_to(m)
m
folium은 지도 위에 데이터도 표현할 수 있다.
Circle 함수는 지도위에 데이터를 동그라미로 표현해주는 함수이다.
radius가 동그라미의 크기이다. color은 동그라미 테두리 색깔, fill은 어떤 색깔로 속을 채울 것인지 물어보는 것이다.
여기서 중요한건 radius는 int형식이면 안된다. float 형식이어야해서 나도 그렇게 설정해주었다.
위 함수의 결과는 아래와 같다.
이렇게 동그라미 크기로 데이터를 표현할 수 있다.
예를들어 인구수나 교통체증이 심한 곳 등등 지리적 정보가 중요한 경우 이렇게 표현할 수 있을 것 같다.
나는 이정도만 했지만 folium은 더 많은 곳에 쓰일 수 있다.
https://python-visualization.github.io/folium/latest/index.html
Folium — Folium 0.1.dev1+g0f4d57f documentation
Folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js library. Manipulate your data in Python, then visualize it in a Leaflet map via Folium. Concepts Folium makes it easy to visualize data that
python-visualization.github.io
위 사이트가 보기 굉장히 편했다. 필요한 함수가 있으면 찾아쓰면 좋을 것 같다.
'Study > Python' 카테고리의 다른 글
[서울시 기온 예측 해커톤] Neuralprophet (1) | 2024.01.05 |
---|---|
[Python] 시각화 3. Geocoding (1) | 2023.12.18 |
[Python] 시각화 1. Pyechart (0) | 2023.11.07 |
[Python] PyCharm에서 main.py (1) | 2023.10.22 |