파이썬(Python)/전국도시공원 Plotly 기본

[생활|1|Plotly] 전국도시공원 - Plotly 기본 (1부)

JJ Goh[Certified customs broker] 2020. 6. 24. 21:32

[생활|1|Plotly] 전국도시공원 - Plotly 기본 (1부)



pandas.read_csv() & plotly.express




 직전까지 다루었던 무역 3번 주제인 '자전거 수출입' 카테고리에서 추가 포스팅으로 주제와는 조금 무관하게 '자전거 대여소 현황' 자료를 가지고 공간데이터 시각화를 해 보았습니다. 

 Plotly라는 라이브러리를 사용하였는데요. matplotlib에서는 구현이 어려운 지도데이터 시각화를 Plotly를 통해서는 간단한 코드 몇 줄로 아주 아름답게 결과물을 표출해 준다는 것까지 알아봤습니다.


 이번엔 plotly를 통한 지도 시각화에서 skill-up을 도모하고자, 전국도시공원 표준데이터를 통해 plotly공식문서에서 안내하고 있는 몇가지 지도 꾸미기 방법을 다루고자 합니다. 


  그럼 Data Mining부터 시작하겠습니다.




 Data Mining & Refining


 먼저 공공데이터포털로 이동해 주시고, 홈화면의 검색창에 '전국도시공원'을 입력하여 검색해 주십시요.

 현재날짜 기준으로 총 1737건의 등록건이 검색됩니다. 하지만 우리는 '표준데이터  카테고리'로 바로 이동하겠습니다.

 


 전국도시공원정보표준데이터가 올라와 있습니다.

 각 자치단체별로 별도로 올려 파일이 산재되어 올라온 데이터를 한데 묶어 전국 데이터로 한데 묶어 다운로드 받을 수 있기 때문에, 우리는 표준데이터 카테고리를 받는게 좋겠습니다. 만약, 특정 지역에만 국한해서 데이터를 원하신다면 해당 지역 파일데이터를 찾으시거나, 검색시 아래와 같이 검색조건으로 관리기관을 특정해 검색하시면 되겠습니다.



이제 CSV 포맷으로 자료를 다운 받아 local drive에 저장하겠습니다.

파일을 열어보면 다음과 같습니다.



 데이터 항목으로 '소재지도로명주소'와 '소재지지번주소'가 있습니다. 사실 중복이나 다름없는 항목입니다. 게다가, 소재지지번주소가 입력된 경우엔 소재지도로명주소가 없는 경우도 꽤 있습니다. pandas를 활용해 데이터 전처리 과정을 하는게 좋겠지만, 이번 포스팅은 plotly기본기 다지기 입니다. 심화응용을 통해 완벽한 자료 시각화결과물을 받는 것은 차후에 하는 것으로 하고 위도, 경도 정보에 오류가 없는지만 훑어 보고 그냥 이 데이터를 이대로 사용하도록 하겠습니다. 

제 검토 결과 위도, 경도 정보에 오류가 될만한 내용은 없습니다.

그럼 이제 plotly 시각화 코딩으로 넘어가 보겠습니다.



 plotly.express 시각화 코딩


 그럼 작성한 코드를 먼저 제시하고 설명을 진행하겠습니다.

import pandas as pd

df = pd.read_csv(r"C:\Users\USER\Desktop\블로그\example\CarAccident\전국도시공원정보표준데이터.csv", encoding='euc-kr')
print(df)

import plotly.express as px

px.set_mapbox_access_token(open("mapbox_token.py").read())

fig = px.scatter_mapbox(df, lat="위도", lon="경도", color="공원면적", size="공원면적",
hover_name="공원명", hover_data=["공원구분","소재지도로명주소","소재지지번주소"],
color_continuous_scale=px.colors.sequential.Viridis, size_max=15, zoom =
7)
fig.update_layout(
mapbox = {'style': "light", 'zoom': 7}, showlegend = False)
fig.show()

 별다른 스타일 꾸미기 없이 몇 줄의 코드로만 구성하였습니다. 

 그런데, 결과물은 더이상의 꾸미기가 필요한가 싶은 수준으로 잘 표현되어 나옵니다.

 Plotly를 통한 지도시각화를 위한 style asset들이 매우 사용자 편의적으로 잘 작성되어 있다는 의미겠지요.


 그럼 코드를 한줄 씩 보시겠습니다.


 1) import pandas as pd

    pandas 모듈을 pd라는 약칭으로 import 해옵니다. 

    우리의 csv파일을 DataFrame으로 읽어들이기 위함입니다.


 2) df = pd.read_csv(r"파일경로", encoding = 'euc-kr')

    이 코드에 관련한 설명은 지난번 포스팅을 통해 상세히 설명 드렸으니, 생략하고 링크를 남겨 두도록 하겠습니다. 

    재확인이 필요하신 분들께서는 아래 링크의 포스팅에서 확인해 주세요.


    링크 : [무역|3|Plotly] 자전거 수출입과 일상의 데이터 - 공간데이터 시각화 Plotly (2부)


  3) import plotly.express as px

    plotly라이브러리의 express 모듈을 px로 약칭하여 import하였습니다.

    plotly의 공식문서 중 map에 대한 라이브러리를 들어가 보시면 대부분의 경우에 plotly.express 사용예시문을 제일 먼저 제시하고 있습니다. 그리고 plotly.express에 대해 사용될 때마다, 아래와 같이 부연을 달아 주고 있습니다.

Plotly Express is the easy-to-use, high-level interface to Plotly, which operates on a variety of types of data and produces easy-to-style figures.

  Plotly Express가 사용 편의성을 더욱 향상 시켰음을 강조하고 있는 것입니다. Plotly의 기존 코딩 방식을 사용해도 문제 없지만 더욱 간편한 사용을 도모하기 위해 Express라 칭한 모듈을 제공하여 문법사용을 더욱 간결하게 해 준 것이라 볼 수 있겠습니다.

  사용하기 편하게 만들어 줬다고 하니, 당연히 즐겨 사용하여야 하겠습니다. 


 4) px.set_mapbox_access_token(open("mapbox_token.py").read())

   plotly를 최근에야 접하고 있는 저 같은 독자분께는 매우 중요한 정보가 될 부분입니다.

   이 코드는 mapbox의 access token을 읽어 들이는 코드입니다. 먼저, plotly의 설명문을 보시겠습니다.

 

Mapbox Maps vs Geo Maps

Plotly supports two different kinds of maps:

  1. Mapbox maps are tile-based maps. If your figure is created with a px.scatter_mapboxpx.line_mapboxpx.choropleth_mapbox or px.density_mapbox function or otherwise contains one or more traces of type go.Scattermapboxgo.Choroplethmapbox or go.Densitymapbox, the layout.mapbox object in your figure contains configuration information for the map itself.
  2. Geo maps are outline-based maps. If your figure is created with a px.scatter_geopx.line_geo or px.choropleth function or otherwise contains one or more traces of type go.Scattergeo or go.Choropleth, the layout.geo object in your figure contains configuration information for the map itself.

This page documents Mapbox tile-based maps, and the Geo map documentation describes how to configure outline-based maps.


     Mapbox라는 회사는 온라인지도를 제작하는 회사입니다. tile-based map이라 하여 지도를 여러개의 조각판(tile)으로 제작해 이어붙여서 보여주는 방식의 map을 제작합니다. 이러한 제작방식은 대부분의 온라인 지도 제작시 사용되는 방법이라고 합니다. 여러조각을 붙여 보여주는 것이니, zoom-in 되었을 때 표출되는 detail은 그렇지 않은 것 보다 매우 정교하거나 아니면 표출속도에서 이점이 많을 수밖에 없으리라 생각됩니다.

 반면에 Geo maps는 outline based maps라고 소개하고 있습니다. 벌써, 두 개 map의 차이는 이 단어만 보아도 mapbox의 맵이 디테일면에서 더욱 훌륭하겠구나라는 추정을 가질 수 있겠습니다.


 여하튼 plotly는 mapbox가 제공하는 map상에 데이터를 표현하도록 관련 라이브러리를 지원하고 있습니다.


 그리고 사용자가 이제 mapbox의 map을 사용해 지도시각화를 하고자 할 때엔, base map에 대해 다음과 같은 옵션을 제공합니다.


Base Maps in layout.mapbox.style

The accepted values for layout.mapbox.style are one of:

  • "white-bg" yields an empty white canvas which results in no external HTTP requests
  • "open-street-map""carto-positron""carto-darkmatter""stamen-terrain""stamen-toner" or "stamen-watercolor" yeild maps composed of raster tiles from various public tile servers which do not require signups or access tokens
  • "basic""streets""outdoors""light""dark""satellite", or "satellite-streets" yeild maps composed of vector tiles from the Mapbox service, and do require a Mapbox Access Token or an on-premise Mapbox installation.
  • A Mapbox service style URL, which requires a Mapbox Access Token or an on-premise Mapbox installation.
  • A Mapbox Style object as defined at https://docs.mapbox.com/mapbox-gl-js/style-spec/


 이 설명에 따라 주목해야 할 부분은 "open-street-map", "carto-positron", "carto-darkmatter", "stamen-terrain", "stamen-toner" or "stamen-watercolor" 스타일의 맵들은 mapbox의 access token을 필요치 아니하고 바로 사용이 가능하다는 것입니다.


 하지만, "basic", "streets", "outdoors", "light", "dark", "satellite", "satellite-streets" 스타일은 mapbox의 access token이 필요하다고 설명하고 있습니다. 


 따라서, 사용하시고자 하는 mapbox의 map 스타일에 따라, access token을 제출하는 코딩을 추가할지 여부를 판단하게 됩니다. 그런데, mapbox access token이라는 것이 별 다르거나 반드시 유료로 이용해야 하는지에 대한 걱정은 하지 않으셔도 되시겠습니다. mapbox는 public key형태의 key도 제공하고 있으니까요.



 그럼 2부에서 이 mapbox의 public key를 받는 방법과 어떻게 access token을 호출하게 할지에 대해 추가 설명 드리도록 하겠습니다.


 

 (2부에 계속..)


 

반응형