Data/Data visualization

[Python, pydeck] colab에서 동물병원 데이터 시각화 2

_Sun_ 2023. 1. 7. 21:22

이전포스트에 이어 이번에는 파이썬 지도시각화 툴인 pydeck을 이용한 지도시각화 과정을 공유한다. 

 

Uber에서 만든 자바스크립트 공간 데이터 시각화 라이브러리 deck.gl

이를 파이썬에서도 쓸 수 있게 만든 라이브러리가 pydeck이라고 한다. 

 

 

Deck — pydeck 0.6.1 documentation

api_keys (dict, default None) – Dictionary of geospatial API service providers, where the keys are mapbox, google_maps, or carto and the values are the API key. Defaults to None if not set. Any of the environment variables MAPBOX_API_KEY, GOOGLE_MAPS_API

pydeck.gl

 

Gallery — pydeck 0.6.1 documentation

Better understand the main object within visualization, used to write data out to a widget in Jupyter, save it out to HTML, and configure some global parameters of a visualization, like its size or tooltip.

pydeck.gl

 

대용량 데이터 렌더링이 안되는 folium과 달리 pydeck은 잘 된다고 한다.

처음엔 mapboxgl 써보려고 했는데 이상하게 colab에서 안 돼서 pydeck을 해봤다.

 

 

데이터 준비

사용한 데이터는 저번 포스팅에서 사용한 동물병원 데이터를 전처리한 csv 파일.

그중 전화번호, 전체주소, 병원이름, 위경도 컬럼만 뽑아 시각화에 사용했다. 

 

import pandas as pd
import numpy as np

hospital = pd.read_csv('hospital.csv', encoding='utf-8')
data=hospital[['소재지전화','도로명전체주소','name','lat','lon']]

 

 

mapbox에서 토큰 발급 받기

pydeck은 mapbox api token이 있어야 사용가능하다고 한다,

근데 colab에서 돌렸을 때는 token이 없이도 잘 돌아갔다.

colab 사용하시는 분들은 토큰 발급하지말고 한번 해보시길

 

1. Mapbox 홈페이지에 들어가서 계정을 생성한다.

 

 

Maps, geocoding, and navigation APIs & SDKs | Mapbox

Integrate custom live maps, location search, and turn-by-turn navigation into any mobile or web app with Mapbox APIs & SDKs. Get started for free.

www.mapbox.com

 

 

내 account- tokens 에 가면 현재 있는 토큰을 확인할 수 있고 또 새 토큰을 생성할 수도 있다.

2. 내 계정에 있는 token 값을 복사한다. 

 

 

 

 

Pydeck

colab에서 pydeck을 설치

 

!pip install pydeck

 

 

환경변수도 추가

 

MAPBOX_API_KEY = 'mapbox 홈페이지에서 복사한 token 붙여넣기'

 

 

pydeck 라이브러리 호출

 

import pydeck as pdk

 

 

Scatterplot Layer

먼저 모든 point들을 지도에 출력하는 scatterplot으로 그려보았다.

 

layer = pdk.Layer(
    'ScatterplotLayer',
    data,
    pickable=True,
    opacity=0.8,
    stroked=True,
    filled=True,
    get_position='[lon, lat]',
    get_radius=100, # scatter의 원 크기
    get_fill_color=[255, 120, 120], # scatter 원 색깔
    get_line_color=[0, 0, 0],    # scatter 원 테두리 색깔
    auto_highlight=True
)

center = [126.986, 37.565] # 서울시 위경도
view_state = pdk.ViewState(
    longitude=center[0],
    latitude=center[1],
    zoom=12)

r = pdk.Deck(layers=[layer],initial_view_state=view_state, tooltip={"text": "{name}\n{도로명전체주소}"}, map_style='road')
r.show()

 

tooltip으로 마우스 오버하면 병원정보가 뜨게 했다. 

가까이서 볼 때는 괜찮은데 지도를 축소하면 scatter가 거의 안보이는 단점이 있었다.

 

 

 

 

Icon Layer

scatterplot과 비슷하지만 해당 자리에 icon을 표시한다. 

 

import pydeck as pdk
import pandas as pd


# Icon load, 쓰려는 icon url 첨부
ICON_URL = 'https://uxwing.com/wp-content/themes/uxwing/download/location-travel-map/pin-location-icon.png'

icon_data = {
    "url": ICON_URL,
    "width": 128,
    "height": 128,
    "anchorY": 128,
}

data["icon_data"] = None
for i in data.index:
    data["icon_data"][i] = icon_data

center = [126.986, 37.565]
view_state = pdk.ViewState(
    longitude=center[0],
    latitude=center[1],
    zoom=12)

icon_layer = pdk.Layer(
    type="IconLayer",
    data=data,
    get_icon="icon_data",
    get_size=2,
    size_scale=10,
    get_position=["lon", "lat"],
    pickable=True,
    opacity=0.8
)

r = pdk.Deck(layers=[icon_layer], initial_view_state=view_state,  tooltip={"text": "{name}\n{소재지전화}\n{도로명전체주소}"}, map_style='road')
r.to_html("hospital_icon.html")

 

tooltip에 전화번호도 추가해서 볼 수 있게 했다. 

 

 

 

 

 

 

 

 

icon layer는 관련 자료가 거의 없어서 구현에 정말 애를 먹었다.

맘에 드는 무료 icon 이미지 찾는 것도 쉽지않았고 url로 불러올 수 있는 png는 더욱 찾기 힘들었다. 

 

 

다행히 iconlayer 관련 깃헙을 찾아서 pydeck 공식갤러리와 같이 보면서 구현했다. 

링크는 포스팅 맨 아래에 있으니까 참고.

 

 

 

맵 스타일

pydeck에서는 다양한 맵스타일을 제공한다.

 

공식문서에서는 mapbox에서 커스텀한 map도 사용할 수 있다고 해서 커스텀해서 불러오려고 해봤는데 colab에서 오류가 생겼다. mapbox_api_key를 layer에 안 넣어서 그런 것 같아서 넣고 해봤지만 오류 해결이 되지 않았다. 

기본적으로는 'light', 'dark', 'road', 'satellite', 'dark_no_labels', 'light_no_labels' 를 쓸 수 있는 것 같다. 

 

 

 

 

 

 

 

pydeck을 쓰면서 이상했던 건 위에서 설정한 환경변수(mapbox_api_key)을 빼고 돌렸는데도 잘 되더라. pydeck은 토큰이 필요없는 건지, 커스텀 맵 사용시에만 필요한 건지 정확한 이유는 모르겠다.

 

 

 

 

 

Pydeck 총평

1. marker cluster 기능이 없어서 지도 축소하면 시각적으로 예쁘지 않다. 

2. 최신 라이브러리라 관련 자료가 거의 없어서 궁금한 점 해소가 잘 안된다.

3. 안정화가 필요할 것 같다. 

 

참고


https://dailyheumsi.tistory.com/147

https://pydeck.gl/gallery/icon_layer.html

https://github.com/visgl/deck.gl/issues/3900