プログラミング学習360日目 〜pydeckで地図上に棒グラフを描いてみる 3日目〜

駄目かと思われたpydeckの解読、ようやくわかりました。
サンプルコードはこれ。

import streamlit as st
import pandas as pd
import pydeck as pdk
import numpy as np

df = pd.DataFrame(
   np.random.randn(1000, 2) / [50, 50] + [37.76, -122.4],
   columns=['lat', 'lon'])
st.pydeck_chart(pdk.Deck(
   map_style='mapbox://styles/mapbox/light-v9',
   initial_view_state=pdk.ViewState(
       latitude=37.76,
       longitude=-122.4,
       zoom=11,
       pitch=50,
   ),
   layers=[
       pdk.Layer(
           'HexagonLayer',
           data=df,
           get_position='[lon, lat]',
           radius=200,
           elevation_scale=4,
           elevation_range=[0, 1000],
           pickable=True,
           extruded=True,
       ),
       pdk.Layer(
           'ScatterplotLayer',
           data=df,
           get_position='[lon, lat]',
           get_color='[200, 30, 0, 160]',
           get_radius=200,
       ),
   ],
))

地図の表記の部分は見れば何となく分かるのですが、layersの部分がどうしてもわかりませんでした。データとして与えられているのは変数dfのみ。中身は緯度と経度の2つのカラムでデータ数は1000。np.randomとしているので読み込むたびに緯度経度が微妙に変わります。

ずっと悩んでいたのが、緯度と経度しか無いデータを読み込むたびにグラフの高さが変わること。そもそも緯度経度の他にデータは一切ないのにグラフの高さが変わることがなぜなのかどうしてもわかりませんでした。カラムがもう一つあって数量的なデータがあるのならばわかるのですが、一切ない。
2日ググりまくってヒントとなるものを見つけられなかったのですが、3日目にしてようやくそれらしき記述を発見しました。

もくもく会の発表か何かでしょうか。
https://scrapbox.io/hannari-python/deck.gl_mokumoku
この中にこんな書き込みがありました。

データはイギリスの交通事故データ。データテーブルには緯度経度があるのみ。1行が1事故。
これをHexagonLayerに与え可視化。 Layerのコンストラクタのoptionにelevationなどがあり事故数が多いと高いビルが立つ,などの視覚効果が設定できる。LayerはDashのコンポーネントに似ている。

パッと見た時はどういうこと?って思いましたが、「1行が1事故」というところでピンときました。
緯度経度が同じものの数をカウントしてそれをグラフに積み上げているのでは?と。試しにdfに同じ緯度経度をいくつか入れてみたところ予想通り積み上がりました。
今日も含め3日悩んだことが報われました。

これでアプリに実装できそうです。各市町村の緯度経度のデータの準備とそのデータと公表されたデータを結合するなどPandasの操作を調べる必要はありますが、それはなんとかなるような気がします。

まだ始まったばかりですが、今年一番のスッキリでした。

この記事が気に入ったらサポートをしてみませんか?