【Python】시구정촌 레벨의 칠해지도 플롯

이 기사의 목적



Python으로 다음과 같은 시구정촌 수준의 그리기 맵을 그립니다.
도도부현 레벨이라면 여기



처음에는 geopandas + geoplot으로 가려고했지만 Google Colab에서 geoplot을 성공적으로 설치할 수 없었기 때문에 geoplot을 포기하고 여러 가지 착오로 가장 단순한 방법에 도달했습니다.
기본적으로 geopandas를 추가로 설치할 수 있으면 괜찮습니다.

그건 그렇고, 색칠은 이번에는 난수 값을 기반으로하므로 적절하게 데이터를 변경하고 싶습니다.

페이지 끝에 코드 목록이 있습니다.

해설



컬러 맵을 만들기 위해 geopandas이라는 라이브러리를 사용하십시오.
pip install geopandas

기타 라이브러리 준비
import numpy as np
import geopandas as gpd
import random
import matplotlib.colors
import matplotlib.pyplot as plt

시구정촌의 형태(다각형)의 데이터를 「국토 수치 정보 다운로드 서비스」

전처리에서 반드시 수행하는 것은 다음과 같이 동일한 시구정촌인데도 복수의 다각형으로 이루어진 데이터를 하나로 정리해야 한다. 또한 필요에 따라 다각형의 단순화 등도 실시한다.


QGIS를 사용하는 경우는 여기 등을 참고로 하고 싶다.

전처리 된 데이터를 geojson 형식으로 내보내고 이것을 geopandas로 읽습니다.
파일의 디렉토리를 적절하게 변경하고 싶습니다.
filename = "/content/drive/My Drive/Colab Notebooks/pref47.geojson"
df = gpd.read_file(filename, encoding='SHIFT-JIS')

또한 채우기에 사용되는 데이터가 여기에서 geopandas 형식의 데이터 프레임에 추가됩니다.
사용법은 pandas와 유사하기 때문에 이해하기 쉽습니다.
이번에는 단순성을 위해 무작위 값을 사용했지만 여기에 인구 및 임금과 같은 데이터를 넣는 것으로 가정합니다.
df["target"] = [random.random() for i in range(df.shape[0])]

시구정촌마다의 데이터로부터, 색칠을 실시하는 색을 결정하는 함수를 정의해 둔다
def colors_scale(arr):
    n_min = min(arr)
    n_max = max(arr)
    cmap = plt.cm.rainbow
    norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)

    arr = [cmap(norm(r)) for r in arr]
    return arr, cmap, norm

마지막으로 지도 플롯
pandas와 비슷한 쓰기로 관심있는 데이터 만 선택하고 mini_df로 만듭니다.
df.plot를 할 때 color=로 색 정보의 리스트를 건네주는 것이 포인트
mini_df = df[df["N03_001"].isin(["愛媛県", "徳島県", "香川県", "高知県"])]

target_color, cmap, norm = colors_scale(mini_df["target"])

mini_df.plot(color=target_color, figsize=(10,6))
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()

이상!

코드 목록


pip install geopandas
import numpy as np
import geopandas as gpd
import random
import matplotlib.colors
import matplotlib.pyplot as plt

filename = "/content/drive/My Drive/Colab Notebooks/pref47.geojson"
df = gpd.read_file(filename, encoding='SHIFT-JIS')

df["target"] = [random.random() for i in range(df.shape[0])]

def colors_scale(arr):
    n_min = min(arr)
    n_max = max(arr)
    cmap = plt.cm.rainbow
    norm = matplotlib.colors.Normalize(vmin=n_min, vmax=n_max)

    arr = [cmap(norm(r)) for r in arr]
    return arr, cmap, norm


mini_df = df[df["N03_001"].isin(["愛媛県", "徳島県", "香川県", "高知県"])]

target_color, cmap, norm = colors_scale(mini_df["target"])

mini_df.plot(color=target_color, figsize=(10,6))
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
plt.colorbar(sm)
plt.show()


참고



국토 수치 정보 다운로드 서비스
09. 일부 피처를 모아서 하나의 피쳐로 만들기
파이썬을 사용하여 shapefile과 geojson을 읽고 그립니다.

좋은 웹페이지 즐겨찾기