관리 메뉴

솜씨좋은장씨

[folium] Choropleth 의 legend를 지우는 방법 (Python) 본문

COMPAS/COMPAS 화성시 최적 시내버스 노선 제안

[folium] Choropleth 의 legend를 지우는 방법 (Python)

솜씨좋은장씨 2020. 9. 5. 23:38
728x90
반응형

요즘! idEANS ( ideans.tistory.com ) 팀원들과 함께

LH 공사에서 주최하는 COMPAS 고양시 공공자전거 스테이션 최적 위치 선정 공모전을 도전해보고 있어 

오랜만에 다시 Folium 라이브러리를 활용하여 이것 저것 데이터를 시각화 해보고 있습니다.

 

그러던 중 화성시 공모전 때와 동일하게 인구수 데이터를 활용하여 지도 위에 동 별 인구수를 시각화 할 필요가 있었습니다.

그러나 이전에 시각화 당시 Choropleth 의 legend가 너무 많이 그려지는 문제가 있었습니다.

 

그 당시에는 이 문제를 해결하지 못했었는데 이번에 다시 동일한 문제를 해결하기 위해 구글링을 해보니

 

Choropleth legends being part of the layer · Issue #1052 · python-visualization/folium

Please add a code sample or a nbviewer link, copy-pastable if possible This is how I created and added the folium.Choropleth layers to the folium.Map object (self.map is a default folium.Map object...

github.com

github issue에 지난 4월 어떤 분이 해결 방법을 올려놓으신 것을 확인하였고 

이를 직접 적용해보니 해결할 수 있었습니다.

 

다음은 화성시 데이터를 바탕으로 위의 issue의 답변을 적용해 본 코드입니다.

 

진행 환경

코드 실행 Python Folium
COMPAS 제공 노트북 3.6.9 0.8.3

 

데이터 다운로드

혹시 화성시 데이터가 필요하시다면 다음의 링크에서 다운로드 받으시면 됩니다.

 

COMPAS

COMPAS

compas.lh.or.kr

 

필요 라이브러리 import 하기

import pandas as pd
import folium
import folium.plugins
import json
import geopandas as gpd

다운로드 받은 geojson 파일 로드하기

my_gpd = gpd.read_file('../PJT001_h_100m_cell_pop.geojson')

( pop_ttl ) 전체 인구수와 ( emd_cd ) 읍면동 코드 데이터만 남기기

my_gpd = my_gpd.loc[ : , ['pop_ttl', 'emd_cd']]

그 중 nan 값을 가진 행들을 제거

my_gpd_drop = my_gpd.dropna()

화성시 읍면동 정보 ( 코드, emd_cd ) 정보가 담긴 geojson 불러오기

import geojson
gdf = gpd.read_file('../PJT001_tl_scco_emd.geojson')
my_json = json.loads(gdf.to_json())
my_json2 = my_json['features']

 

Folium 라이브러리를 활용하여 지도에 시각화

중심이 될 좌표값

latitude = 37.136881
longitude = 127.036171

choropleth를 활용하여 시각화

def folium_del_legend(choropleth: folium.Choropleth):
    del_list = []
    for child in choropleth._children:
        if child.startswith('color_map'):
            del_list.append(child)
    for del_item in del_list:
        choropleth._children.pop(del_item)
    
    return choropleth

m = folium.Map(location=[latitude, longitude], zoom_start=10)#, tiles='color_map')

gdf = gdf.to_crs(epsg='4326')
converted_json = gdf.to_json()

def draw_data(data):
    choropleth_data = folium.Choropleth(
            geo_data = data,
            name='인구수',
            data=my_gpd_drop,
            columns=['emd_cd', 'pop_ttl'],
            key_on='properties.emd_cd',
            fill_color='YlGn',
            fill_opacity=0.7,
            line_opacity=0.3,
            color = 'gray',
            overlays=True
    )
    
    return choropleth_data
    


for i in range(len(my_json2)):
    if i == 0:
        draw_data(my_json2[i]).add_to(m)
    elif i > 0:
        folium_del_legend(draw_data(my_json2[i]).add_to(m)).add_to(m)

결과를 HTML 파일로 저장

m.save('population_visualization.html')

github issue의 방법대로 이번에는 하나의 legend 이외에 나머지 legend는 지워지는 것을 확인할 수 있었습니다.

 

이전에는 결과물 캡쳐사진을 찍기위해서 chrome 개발자 도구를 열어 html 코드에서 하나하나 삭제하며 지웠던 기억이....

 

그래도 해결 방법을 알게되어 기분이 좋습니다.

 

나머지 진행하면서 알게된 점들은 공모전 이후에 적어보려합니다.

 

읽어주셔서 감사합니다!

Comments