こんにちは、JS2IIUです。
Streamlitは、Pythonでインタラクティブなウェブアプリケーションを簡単に作成できるオープンソースライブラリです。その中でも、st.mapは位置データを地図上に表示するのに便利な関数です。この記事では、st.mapの基本的な使い方と、具体的なサンプルプログラムを通して、その使いどころ、そして注意点をご紹介します。今回もよろしくお願いします。
st.mapの基本
st.mapは、緯度と経度の情報を含むデータフレームを受け取り、地図上にマーカーとしてプロットします。地図はMapboxが使われています。
st.map(data=None, *, latitude=None, longitude=None, color=None, size=None, zoom=None, use_container_width=True, width=None, height=None)パラメータ:
- data: プロットするデータ (st.dataframeでサポートされているもの)
- latitude: データポイントの緯度座標を含む列の名前。Noneの場合、’lat’、’latitude’、’LAT’、’LATITUDE’という名前の列から緯度データを取得します。
- longitude: データポイントの経度座標を含む列の名前。Noneの場合、’lon’、’longitude’、’LON’、’LONGITUDE’という名前の列から経度データを取得します。
- color: 各データポイントを表す円のの色。None、16進数文字列、RGBまたはRGBAタプルで指定できます。列名を指定して、列の値に基づいて色を動的に設定することもできます。
- size: 各ポイントを表す円のサイズ (メートル単位)。None、数値、または列名を指定できます。列名を指定すると、各データポイントのサイズを動的に設定できます。
- zoom: ズームレベル。
- use_container_width: マップの幅を親コンテナの幅に合わせるかどうか。
- width: マップの幅 (ピクセル単位)。
- height: マップの高さ (ピクセル単位)。
その他:
- st.mapはst.pydeck_chartのラッパーであり、地図上に散布図チャートを簡単に作成できます。
- Mapboxのタイルを使用して地図コンテンツをレンダリングします。
- Mapboxの利用規約が適用されます。
- StreamlitはMapboxトークンを提供していますが、ユーザーは独自のトークンを作成して使用することを強くお勧めします。
基本的な使い方例:
import streamlit as st
import pandas as pd
df = pd.DataFrame({
'lat': [35.689487, 35.658581, 35.703717],
'lon': [139.691706, 139.745433, 139.771357]
})
st.write('st.map exsample')
st.map(df)これだけで、東京タワー、渋谷スクランブル交差点、新宿駅周辺の地図が表示されます。

サンプルプログラム
1. Uber Ridesharing Data
Uberの乗車データを使って、乗車場所を地図上に可視化してみましょう。
import streamlit as st
import pandas as pd
df = pd.read_csv('uber-raw-data-apr14.csv')
df['Date/Time'] = pd.to_datetime(df['Date/Time'])
df['hour'] = df['Date/Time'].dt.hour
st.title('Uber Ridesharing Data')
st.header('Pickup Locations')
st.map(df)
st.header('Hourly Pickup Counts')
hourly_counts = df.groupby('hour').size()
st.bar_chart(hourly_counts)このプログラムでは、uber-raw-data-apr14.csvからUberの乗車データを読み込み、st.mapで乗車場所を地図上に表示しています。さらに、乗車時間帯ごとのヒストグラムも表示することで、データの傾向をより深く理解することができます。


生成AIで作った架空のUberデータ(uber-raw-data-apr14.csv)はこちらからコピーして下さい。
2. Airbnb Listings
Airbnbのリスティングデータを使って、宿泊施設の場所と価格を地図上に可視化してみましょう。
import streamlit as st
import pandas as pd
df = pd.read_csv('airbnb-listings_20.csv')
st.title('Airbnb Listings')
st.map(df[['latitude', 'longitude']])このプログラムでは、airbnb-listings.csvからAirbnbのリスティングデータを読み込み、st.mapで宿泊施設の場所を地図上に表示しています。

架空のAirbnbデータ(airbnb-listings_20.csv)はこちらから入手して下さい。
3. 地震発生地点の可視化
import streamlit as st
import pandas as pd
df = pd.read_csv('dataset_2195_quake.csv')
st.title('Earthquake Data')
st.map(df[['latitude', 'longitude']])このプログラムでは、地震の発生地点を緯度経度情報のサンプルデータからst.mapで地図上に表示しています。

地震データはKaggleのQuakesを利用しています。データの構成は以下のとおりで、4カラムで構成されています。
- focal_depth: 震源の深さのことです。地震が発生した地下の地点までの距離をキロメートル(km)で表します。地表に近い場所で発生する地震は浅発地震、深い場所で発生する地震は深発地震と呼ばれます。震源の深さは、地震の揺れの強さや範囲に影響を与えます。
- latitude: 震源の緯度を表します。緯度は、地球上の位置を北緯と南緯で表す角度で、赤道が0度、北極が北緯90度、南極が南緯90度となります。
- longitude: 震源の経度を表します。経度は、地球上の位置を東経と西経で表す角度で、イギリスのグリニッジ天文台を通る経線が0度となり、東に向かって180度までが東経、西に向かって180度までが西経となります。
- richter: 地震の規模を表すマグニチュードのことです。マグニチュードは、地震で放出されるエネルギーの大きさを対数で表したもので、一般的にリヒタースケールで表されます。マグニチュードが1大きくなると、地震のエネルギーは約32倍になります。
マグニチュードのデータを使って、プロットする点の大きさを変えてみます。sizeパラメータを指定します。マグニチュードの大きさを強調するように少し計算を入れています。
import streamlit as st
import pandas as pd
df = pd.read_csv('main3/dataset_2195_quake.csv')
df['richter'] = df['richter'] * df['richter'] * 10000
st.title('Earthquake Data')
st.map(df, latitude='latitude', longitude='longitude', size='richter')
st.mapを使う上での注意点
- データ量: 大量のデータを
st.mapで表示すると、パフォーマンスが低下する可能性があります。大量のデータを扱う場合は、データの集約やフィルタリングを検討してください。 - Mapboxの利用規約:
st.mapはMapboxのタイルを使用して地図コンテンツをレンダリングします。Mapboxの利用規約を遵守する必要があります。 - Mapboxトークン: StreamlitはMapboxトークンを提供していますが、独自のトークンを作成して使用することを強くお勧めします。
まとめ
st.mapは、Streamlitで位置データをたった数行で、簡単に可視化することができるとても強力なツールです。この記事で紹介したサンプルプログラムを参考に、ぜひご自身のアプリケーションで活用してみてください。
参考になるWEBサイト
- st.map – Streamlit Docs
- Streamlit documentation
- Mapbox | Maps, Navigation, Search, and Data
- Streamlitで札幌のオープンデータを可視化する
Pythonに関する書籍の<PR>です。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。
最後まで読んでいただきありがとうございました。


コメント