{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# MATLAB Mobile(無料枠)とfoliumによるGPSデータのプロット \n",
" \n",
"このぺージではMATLAB Mobileの無料枠の機能を利用して、MATLAB Mobileをiphoneにインストールして、それをもって移動したときのGPSによる位置情報を地図上にプロットするということを行います。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## pythonコード \n",
"必要なライブラリのインポート"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.8.12 | packaged by conda-forge | (default, Sep 16 2021, 01:40:49) [MSC v.1916 64 bit (AMD64)]\n",
"folium version: 0.12.0\n",
"2.0.9\n",
"1.3.3\n",
"1.21.2\n",
"0.9.0\n"
]
}
],
"source": [
"import folium\n",
"import json\n",
"import pandas as pd\n",
"import numpy as np\n",
"import geopandas as gpd\n",
"import sys\n",
"print(sys.version)\n",
"print('folium version: 0.12.0')\n",
"print(json.__version__)\n",
"print(pd.__version__)\n",
"print(np.__version__)\n",
"print(gpd.__version__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ベースマップの作成 \n",
"GPSデータをプロットする前のベースとなるマップを用意します。`folium.Map`を利用して作成することができます"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m = folium.Map(location=[35.7056232, 139.751919], # 中心の設定:今回は東京ドーム\n",
" tiles='cartodbpositron', # 地図のスタイルを設定\n",
" zoom_start = 11, # 初期ズーム率を設定\n",
" control_scale = True\n",
" ) \n",
"m # 作成したベースマップを表示"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"jupyter notebookでは上のマップを表示するためにFile -> trust notebookをクリックしました "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 23区の境界などを格納した情報を読み込み \n",
"読み込みに関しては、`open(r'tokyo23.json) -> json.load(f)`の流れで読み込めるらしいのですが、私の環境ではエラーが出てしまったため以下のように読み込みました。そして、私の環境では、データフレームに変換して後のグラデーションの表示(Choropleth図)がうまくいったので \n",
"データフレームに変換 -> column名の変更 という作業を行っています"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" N03_001 | \n",
" N03_002 | \n",
" N03_003 | \n",
" N03_004 | \n",
" N03_007 | \n",
" geometry | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 台東区 | \n",
" 13106 | \n",
" MULTIPOLYGON (((139.76667 35.71330, 139.76609 ... | \n",
"
\n",
" \n",
" 1 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 杉並区 | \n",
" 13115 | \n",
" MULTIPOLYGON (((139.64081 35.66667, 139.64076 ... | \n",
"
\n",
" \n",
" 2 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 文京区 | \n",
" 13105 | \n",
" MULTIPOLYGON (((139.71782 35.71605, 139.71783 ... | \n",
"
\n",
" \n",
" 3 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 新宿区 | \n",
" 13104 | \n",
" MULTIPOLYGON (((139.71397 35.67918, 139.71421 ... | \n",
"
\n",
" \n",
" 4 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 世田谷区 | \n",
" 13112 | \n",
" MULTIPOLYGON (((139.62407 35.61081, 139.62405 ... | \n",
"
\n",
" \n",
" 5 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 江戸川区 | \n",
" 13123 | \n",
" MULTIPOLYGON (((139.85000 35.63841, 139.84999 ... | \n",
"
\n",
" \n",
" 6 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 墨田区 | \n",
" 13107 | \n",
" MULTIPOLYGON (((139.79517 35.70466, 139.79702 ... | \n",
"
\n",
" \n",
" 7 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 港区 | \n",
" 13103 | \n",
" MULTIPOLYGON (((139.71369 35.65800, 139.71367 ... | \n",
"
\n",
" \n",
" 8 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 豊島区 | \n",
" 13116 | \n",
" MULTIPOLYGON (((139.68229 35.72460, 139.68226 ... | \n",
"
\n",
" \n",
" 9 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 江東区 | \n",
" 13108 | \n",
" MULTIPOLYGON (((139.77500 35.61608, 139.77350 ... | \n",
"
\n",
" \n",
" 10 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 荒川区 | \n",
" 13118 | \n",
" MULTIPOLYGON (((139.75833 35.74473, 139.75720 ... | \n",
"
\n",
" \n",
" 11 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 練馬区 | \n",
" 13120 | \n",
" MULTIPOLYGON (((139.56564 35.72166, 139.56568 ... | \n",
"
\n",
" \n",
" 12 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 葛飾区 | \n",
" 13122 | \n",
" MULTIPOLYGON (((139.81667 35.74979, 139.81650 ... | \n",
"
\n",
" \n",
" 13 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 品川区 | \n",
" 13109 | \n",
" MULTIPOLYGON (((139.69539 35.60749, 139.69541 ... | \n",
"
\n",
" \n",
" 14 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 大田区 | \n",
" 13111 | \n",
" MULTIPOLYGON (((139.75000 35.54457, 139.74932 ... | \n",
"
\n",
" \n",
" 15 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 中野区 | \n",
" 13114 | \n",
" MULTIPOLYGON (((139.62500 35.72831, 139.62481 ... | \n",
"
\n",
" \n",
" 16 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 中央区 | \n",
" 13102 | \n",
" MULTIPOLYGON (((139.75833 35.65976, 139.75813 ... | \n",
"
\n",
" \n",
" 17 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 北区 | \n",
" 13117 | \n",
" MULTIPOLYGON (((139.72363 35.73993, 139.72359 ... | \n",
"
\n",
" \n",
" 18 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 千代田区 | \n",
" 13101 | \n",
" MULTIPOLYGON (((139.73150 35.68150, 139.73120 ... | \n",
"
\n",
" \n",
" 19 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 目黒区 | \n",
" 13110 | \n",
" MULTIPOLYGON (((139.68053 35.60445, 139.68045 ... | \n",
"
\n",
" \n",
" 20 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 渋谷区 | \n",
" 13113 | \n",
" MULTIPOLYGON (((139.71128 35.66667, 139.71102 ... | \n",
"
\n",
" \n",
" 21 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 板橋区 | \n",
" 13119 | \n",
" MULTIPOLYGON (((139.67317 35.74768, 139.67325 ... | \n",
"
\n",
" \n",
" 22 | \n",
" 東京都 | \n",
" | \n",
" | \n",
" 足立区 | \n",
" 13121 | \n",
" MULTIPOLYGON (((139.81650 35.75000, 139.81650 ... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" N03_001 N03_002 N03_003 N03_004 N03_007 \\\n",
"0 東京都 台東区 13106 \n",
"1 東京都 杉並区 13115 \n",
"2 東京都 文京区 13105 \n",
"3 東京都 新宿区 13104 \n",
"4 東京都 世田谷区 13112 \n",
"5 東京都 江戸川区 13123 \n",
"6 東京都 墨田区 13107 \n",
"7 東京都 港区 13103 \n",
"8 東京都 豊島区 13116 \n",
"9 東京都 江東区 13108 \n",
"10 東京都 荒川区 13118 \n",
"11 東京都 練馬区 13120 \n",
"12 東京都 葛飾区 13122 \n",
"13 東京都 品川区 13109 \n",
"14 東京都 大田区 13111 \n",
"15 東京都 中野区 13114 \n",
"16 東京都 中央区 13102 \n",
"17 東京都 北区 13117 \n",
"18 東京都 千代田区 13101 \n",
"19 東京都 目黒区 13110 \n",
"20 東京都 渋谷区 13113 \n",
"21 東京都 板橋区 13119 \n",
"22 東京都 足立区 13121 \n",
"\n",
" geometry \n",
"0 MULTIPOLYGON (((139.76667 35.71330, 139.76609 ... \n",
"1 MULTIPOLYGON (((139.64081 35.66667, 139.64076 ... \n",
"2 MULTIPOLYGON (((139.71782 35.71605, 139.71783 ... \n",
"3 MULTIPOLYGON (((139.71397 35.67918, 139.71421 ... \n",
"4 MULTIPOLYGON (((139.62407 35.61081, 139.62405 ... \n",
"5 MULTIPOLYGON (((139.85000 35.63841, 139.84999 ... \n",
"6 MULTIPOLYGON (((139.79517 35.70466, 139.79702 ... \n",
"7 MULTIPOLYGON (((139.71369 35.65800, 139.71367 ... \n",
"8 MULTIPOLYGON (((139.68229 35.72460, 139.68226 ... \n",
"9 MULTIPOLYGON (((139.77500 35.61608, 139.77350 ... \n",
"10 MULTIPOLYGON (((139.75833 35.74473, 139.75720 ... \n",
"11 MULTIPOLYGON (((139.56564 35.72166, 139.56568 ... \n",
"12 MULTIPOLYGON (((139.81667 35.74979, 139.81650 ... \n",
"13 MULTIPOLYGON (((139.69539 35.60749, 139.69541 ... \n",
"14 MULTIPOLYGON (((139.75000 35.54457, 139.74932 ... \n",
"15 MULTIPOLYGON (((139.62500 35.72831, 139.62481 ... \n",
"16 MULTIPOLYGON (((139.75833 35.65976, 139.75813 ... \n",
"17 MULTIPOLYGON (((139.72363 35.73993, 139.72359 ... \n",
"18 MULTIPOLYGON (((139.73150 35.68150, 139.73120 ... \n",
"19 MULTIPOLYGON (((139.68053 35.60445, 139.68045 ... \n",
"20 MULTIPOLYGON (((139.71128 35.66667, 139.71102 ... \n",
"21 MULTIPOLYGON (((139.67317 35.74768, 139.67325 ... \n",
"22 MULTIPOLYGON (((139.81650 35.75000, 139.81650 ... "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokyo23_df=gpd.read_file('tokyo23.json')\n",
"tokyo23_df = tokyo23_df.rename(columns={'code': 'N03_007'})\n",
"tokyo23_df.head(23) #はじめの5行を表示"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## コードがN03_007というcolumnに入っていることを確認 \n",
"strタイプになっていることがわかります。後半ではこのコードによって、その区と人口を紐づけます。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['13106' '13115' '13105' '13104' '13112' '13123' '13107' '13103' '13116'\n",
" '13108' '13118' '13120' '13122' '13109' '13111' '13114' '13102' '13117'\n",
" '13101' '13110' '13113' '13119' '13121']\n",
"\n"
]
}
],
"source": [
"code=tokyo23_df['N03_007'].values\n",
"print(code)\n",
"code_0=code[0]\n",
"print(type(code_0))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 東京23区の市区町村コードとその区の名前のペアの読み込み"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" code | \n",
" name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 13101 | \n",
" 千代田区 | \n",
"
\n",
" \n",
" 1 | \n",
" 13102 | \n",
" 中央区 | \n",
"
\n",
" \n",
" 2 | \n",
" 13103 | \n",
" 港区 | \n",
"
\n",
" \n",
" 3 | \n",
" 13104 | \n",
" 新宿区 | \n",
"
\n",
" \n",
" 4 | \n",
" 13105 | \n",
" 文京区 | \n",
"
\n",
" \n",
" 5 | \n",
" 13106 | \n",
" 台東区 | \n",
"
\n",
" \n",
" 6 | \n",
" 13107 | \n",
" 墨田区 | \n",
"
\n",
" \n",
" 7 | \n",
" 13108 | \n",
" 江東区 | \n",
"
\n",
" \n",
" 8 | \n",
" 13109 | \n",
" 品川区 | \n",
"
\n",
" \n",
" 9 | \n",
" 13110 | \n",
" 目黒区 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" code name\n",
"0 13101 千代田区\n",
"1 13102 中央区\n",
"2 13103 港区\n",
"3 13104 新宿区\n",
"4 13105 文京区\n",
"5 13106 台東区\n",
"6 13107 墨田区\n",
"7 13108 江東区\n",
"8 13109 品川区\n",
"9 13110 目黒区"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"code_name=pd.read_csv('code_name.csv', encoding=\"shift-jis\")\n",
"code_name.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 東京23区の名前と人口のペアの読み込み"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 千代田区 | \n",
" 61420 | \n",
"
\n",
" \n",
" 1 | \n",
" 中央区 | \n",
" 157484 | \n",
"
\n",
" \n",
" 2 | \n",
" 港区 | \n",
" 253940 | \n",
"
\n",
" \n",
" 3 | \n",
" 新宿区 | \n",
" 343494 | \n",
"
\n",
" \n",
" 4 | \n",
" 文京区 | \n",
" 227224 | \n",
"
\n",
" \n",
" 5 | \n",
" 台東区 | \n",
" 203219 | \n",
"
\n",
" \n",
" 6 | \n",
" 墨田区 | \n",
" 264515 | \n",
"
\n",
" \n",
" 7 | \n",
" 江東区 | \n",
" 510692 | \n",
"
\n",
" \n",
" 8 | \n",
" 品川区 | \n",
" 398732 | \n",
"
\n",
" \n",
" 9 | \n",
" 目黒区 | \n",
" 283153 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population\n",
"0 千代田区 61420\n",
"1 中央区 157484\n",
"2 港区 253940\n",
"3 新宿区 343494\n",
"4 文京区 227224\n",
"5 台東区 203219\n",
"6 墨田区 264515\n",
"7 江東区 510692\n",
"8 品川区 398732\n",
"9 目黒区 283153"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"name_population=pd.read_csv('name_population.csv', encoding=\"shift-jis\")\n",
"name_population.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## pd.mergeを用いて23区の名前を利用してデータフレームを横方向に結合 \n",
"code_**name**と**name**_populationでは**name**のcolumnが共通しているので、その重複を利用して2つのデータフレームを結合することができます。23区の人口の場合は欠損値はありませんが、データ取得ができておらずNANになっている場合でも `how=outer` を利用して結合可能です。"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" name | \n",
" population | \n",
" code | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 千代田区 | \n",
" 61420 | \n",
" 13101 | \n",
"
\n",
" \n",
" 1 | \n",
" 中央区 | \n",
" 157484 | \n",
" 13102 | \n",
"
\n",
" \n",
" 2 | \n",
" 港区 | \n",
" 253940 | \n",
" 13103 | \n",
"
\n",
" \n",
" 3 | \n",
" 新宿区 | \n",
" 343494 | \n",
" 13104 | \n",
"
\n",
" \n",
" 4 | \n",
" 文京区 | \n",
" 227224 | \n",
" 13105 | \n",
"
\n",
" \n",
" 5 | \n",
" 台東区 | \n",
" 203219 | \n",
" 13106 | \n",
"
\n",
" \n",
" 6 | \n",
" 墨田区 | \n",
" 264515 | \n",
" 13107 | \n",
"
\n",
" \n",
" 7 | \n",
" 江東区 | \n",
" 510692 | \n",
" 13108 | \n",
"
\n",
" \n",
" 8 | \n",
" 品川区 | \n",
" 398732 | \n",
" 13109 | \n",
"
\n",
" \n",
" 9 | \n",
" 目黒区 | \n",
" 283153 | \n",
" 13110 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" name population code\n",
"0 千代田区 61420 13101\n",
"1 中央区 157484 13102\n",
"2 港区 253940 13103\n",
"3 新宿区 343494 13104\n",
"4 文京区 227224 13105\n",
"5 台東区 203219 13106\n",
"6 墨田区 264515 13107\n",
"7 江東区 510692 13108\n",
"8 品川区 398732 13109\n",
"9 目黒区 283153 13110"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"merged_df=pd.merge(name_population, code_name, how='outer')\n",
"merged_df.head(10) # 結合したデータフレームの値を確認"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"codeとpopulationのみを取り出したデータフレームを作成します"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"tokyo23_population_df=merged_df.loc[:,['code','population']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"結合したデータフレームの値を確認します"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" N03_007 | \n",
" population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 13101 | \n",
" 61420 | \n",
"
\n",
" \n",
" 1 | \n",
" 13102 | \n",
" 157484 | \n",
"
\n",
" \n",
" 2 | \n",
" 13103 | \n",
" 253940 | \n",
"
\n",
" \n",
" 3 | \n",
" 13104 | \n",
" 343494 | \n",
"
\n",
" \n",
" 4 | \n",
" 13105 | \n",
" 227224 | \n",
"
\n",
" \n",
" 5 | \n",
" 13106 | \n",
" 203219 | \n",
"
\n",
" \n",
" 6 | \n",
" 13107 | \n",
" 264515 | \n",
"
\n",
" \n",
" 7 | \n",
" 13108 | \n",
" 510692 | \n",
"
\n",
" \n",
" 8 | \n",
" 13109 | \n",
" 398732 | \n",
"
\n",
" \n",
" 9 | \n",
" 13110 | \n",
" 283153 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" N03_007 population\n",
"0 13101 61420\n",
"1 13102 157484\n",
"2 13103 253940\n",
"3 13104 343494\n",
"4 13105 227224\n",
"5 13106 203219\n",
"6 13107 264515\n",
"7 13108 510692\n",
"8 13109 398732\n",
"9 13110 283153"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokyo23_population_df.columns = ['N03_007','population']\n",
"tokyo23_population_df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 各区の人口の情報を読み込み \n",
"注意:ここではCSVファイルから読み込んだ区のコードは数値として読み込まれているので、 \n",
"上のセルにあるような文字(str)配列に変更する必要があります \n",
"また、自前のデータで行う場合はpopulationに相当する値が文字列として数字が入っている場合は図の作成時にエラーが出てしまうため変換が必要です"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" N03_007 | \n",
" population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 13101 | \n",
" 61420 | \n",
"
\n",
" \n",
" 1 | \n",
" 13102 | \n",
" 157484 | \n",
"
\n",
" \n",
" 2 | \n",
" 13103 | \n",
" 253940 | \n",
"
\n",
" \n",
" 3 | \n",
" 13104 | \n",
" 343494 | \n",
"
\n",
" \n",
" 4 | \n",
" 13105 | \n",
" 227224 | \n",
"
\n",
" \n",
" 5 | \n",
" 13106 | \n",
" 203219 | \n",
"
\n",
" \n",
" 6 | \n",
" 13107 | \n",
" 264515 | \n",
"
\n",
" \n",
" 7 | \n",
" 13108 | \n",
" 510692 | \n",
"
\n",
" \n",
" 8 | \n",
" 13109 | \n",
" 398732 | \n",
"
\n",
" \n",
" 9 | \n",
" 13110 | \n",
" 283153 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" N03_007 population\n",
"0 13101 61420\n",
"1 13102 157484\n",
"2 13103 253940\n",
"3 13104 343494\n",
"4 13105 227224\n",
"5 13106 203219\n",
"6 13107 264515\n",
"7 13108 510692\n",
"8 13109 398732\n",
"9 13110 283153"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokyo23_population_df['N03_007'] = tokyo23_population_df['N03_007'].astype('str')\n",
"tokyo23_population_df.head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## choropleth図の作成 \n",
"folium.Choroplethという機能を使って作図していきます。以下のように設定を定義します。"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"folium.Choropleth(geo_data=tokyo23_df, # 地理情報のファイル\n",
" name = 'choropleth_tokyo23', # 出力する地図プロットの名前\n",
" data = tokyo23_population_df, # 各区の人口データ\n",
" columns=['N03_007', 'population'], # 各区の人口データのkey列とその値の列を指定\n",
" key_on='feature.properties.N03_007', # keyの情報:feature.properties.xxの形。N03_007の値を基に人口データと紐づける\n",
" fill_opacity=0.41, # グラデーションであらわすときの色の濃さを指定\n",
" line_opacity=0.1, # 区の境界線の濃さを指定\n",
" line_color='blue', # 境界線の色を指定\n",
" fill_color='YlGn' # グラデーションのカラーマップを指定\n",
" ).add_to(m)\n",
"folium.LayerControl().add_to(m) # ベースマップmにchoroplethの設定を追加\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"このように23区の人口の多さをグラデーションで示すことができました。次は前半のMATLAB Mobileによりスマートフォンから取得したGPSデータをプロットしていきます。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matlab Onlineで作成したlatlon.csvの取り込み"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Latitude | \n",
" Longitude | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 35.69610 | \n",
" 139.75904 | \n",
"
\n",
" \n",
" 1 | \n",
" 35.69609 | \n",
" 139.75893 | \n",
"
\n",
" \n",
" 2 | \n",
" 35.69608 | \n",
" 139.75886 | \n",
"
\n",
" \n",
" 3 | \n",
" 35.69608 | \n",
" 139.75879 | \n",
"
\n",
" \n",
" 4 | \n",
" 35.69607 | \n",
" 139.75873 | \n",
"
\n",
" \n",
" 5 | \n",
" 35.69607 | \n",
" 139.75865 | \n",
"
\n",
" \n",
" 6 | \n",
" 35.69607 | \n",
" 139.75856 | \n",
"
\n",
" \n",
" 7 | \n",
" 35.69605 | \n",
" 139.75848 | \n",
"
\n",
" \n",
" 8 | \n",
" 35.69602 | \n",
" 139.75838 | \n",
"
\n",
" \n",
" 9 | \n",
" 35.69601 | \n",
" 139.75829 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Latitude Longitude\n",
"0 35.69610 139.75904\n",
"1 35.69609 139.75893\n",
"2 35.69608 139.75886\n",
"3 35.69608 139.75879\n",
"4 35.69607 139.75873\n",
"5 35.69607 139.75865\n",
"6 35.69607 139.75856\n",
"7 35.69605 139.75848\n",
"8 35.69602 139.75838\n",
"9 35.69601 139.75829"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"locations = pd.read_csv(\"latlon.csv\") # 読み込み\n",
"numPlot=np.size(locations.Longitude) # データの個数を取得\n",
"locations.head(10) # 一部を表示"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## GPSのデータをラインで表示する \n",
"`folium.vector_layers.PolyLine`を用いてラインを書くことができます"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"line = folium.vector_layers.PolyLine(\n",
" locations=locations, \n",
" color='blue', \n",
" weight=3)\n",
"# マーカーと線の地図レイヤへの追加\n",
"m.add_child(line)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 始点と終点をアイコンで表示 \n",
"GPSデータの最初と最後の座標を取得し、folium.Marker関数でアイコンを表示します"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Make this Notebook Trusted to load map: File -> Trust Notebook
"
],
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"folium.Marker(location=[locations.Latitude[0], locations.Longitude[0]],\n",
" icon=folium.Icon(color=\"red\", icon=\"home\")).add_to(m)\n",
"folium.Marker(location=[locations.Latitude[numPlot-1], locations.Longitude[numPlot-1]],\n",
" icon=folium.Icon(color=\"red\", icon=\"step-forward\")).add_to(m)\n",
"m"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 結果の保存 \n",
"m.saveを用いてhtlm形式で保存することができます。私の環境ではそのまま開くとうまく見ることができました"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"m.save('out.html') # 結果の保存"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## まとめ \n",
"MATLAB Mobileを用いてGPSデータを取得し、MATLAB Online(無料の機能)を用いてCSV形式で保存をしました。そしてpythonのfoliumを用いてその軌跡をプロットすることができました。同様の機能やライブラリを用いて他にもあらゆるタイプのプロットができそうです。 \n",
"機会があればまた別のプロットの種類も試してみたいと思います。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"oldHeight": 328.538,
"position": {
"height": "240px",
"left": "1175.35px",
"right": "20px",
"top": "244px",
"width": "350px"
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"varInspector_section_display": "none",
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}