2次元カーネル密度の描画する

2次元カーネル密度の描画を実行します。

# ライブラリのインポート

!pip install -U matplotlib
import warnings
warnings.simplefilter('ignore')

import numpy as np
import pandas as pd
from shapely import wkt
from shapely.geometry import Point

from scipy import stats
from scipy.stats import gaussian_kde
from skimage.transform import resize, rotate

import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.image as mpimg 

try:
  import geojsoncontour
except:
  !pip install geojsoncontour
  import geojsoncontour

# データの読み込み

下記のコードでデータを読み込みます。

# データの生成
cood = []
for i in range(100):
    t = random.randint(0, 24)
    x = random.uniform(139.74, 139.75)
    y = random.uniform(35.65, 35.66)
    cood.append([t, x, y])

for i in range(400):
    t = random.randint(0, 24)
    x = random.uniform(139.72, 139.77)
    y = random.uniform(35.63, 35.68)
    cood.append([t, x, y])

# データフレーム化
df_plot = pd.DataFrame(cood, columns=["time", "lon", "lat"])
df_plot.head(2)

# 背景画像の準備

matplotlibで背景に使う画像を示します.

「右上」:139.786, 35.695

「左下」:139.747, 35.668

# 2次元カーネルの描画実行

時空間カーネルの描画実行します。

# 座標をnumpy化
array_plot = df_plot[['lon', 'lat']].values

# plt.figure(figsize=(32, 18))
figure = plt.figure(figsize=(16, 9))
# ax = figure.add_subplot(111)

map_img = mpimg.imread('./osm.png')

# カーネル密度
kde = gaussian_kde(array_plot.T)

# 等高線を引く領域のx座標とy座標のリストを用意する
x = np.linspace(array_plot[:, 0].max(), array_plot[:, 0].min(), 200)
y = np.linspace(array_plot[:, 1].max(), array_plot[:, 1].min(), 200)
# メッシュに変換
xx, yy = np.meshgrid(x, y)
# kdeが受け取れる形に整形
meshdata = np.vstack([xx.ravel(), yy.ravel()])
# 高さのデータ計算
z = kde.evaluate(meshdata)

# 可視化
fig = plt.figure(figsize=(16, 9))
ax = fig.add_subplot(111)
# ax.scatter(data[:, 0], data[:, 1], c="b")
contourf = ax.contourf(xx, yy, z.reshape(len(y), len(x)), cmap=plt.cm.jet, alpha=0.4,  levels=10)
contourf.collections[0].set_alpha(0)

plt.imshow(map_img, zorder=0, extent=[139.747, 139.786, 35.668, 35.695])
plt.show()

# 2次元カーネルをgeojsonで保存

2次元カーネルをgeojsonで保存します。

GISソフトに読み込ませるために,geojsonで出力します.

# plt.figure(figsize=(32, 18))
figure = plt.figure(figsize=(16, 9))
# ax = figure.add_subplot(111)

# カーネル密度
kde = gaussian_kde(array_plot.T)

# 等高線を引く領域のx座標とy座標のリストを用意する
x = np.linspace(array_plot[:, 0].max(), array_plot[:, 0].min(), 200)
y = np.linspace(array_plot[:, 1].max(), array_plot[:, 1].min(), 200)
# メッシュに変換
xx, yy = np.meshgrid(x, y)
# kdeが受け取れる形に整形
meshdata = np.vstack([xx.ravel(), yy.ravel()])
# 高さのデータ計算
z = kde.evaluate(meshdata)

# 可視化
fig = plt.figure(figsize=(16, 9))
ax = fig.add_subplot(111)
# ax.scatter(data[:, 0], data[:, 1], c="b")
contourf = ax.contourf(xx, yy, z.reshape(len(y), len(x)), cmap=plt.cm.jet, alpha=0.4,  levels=10)
contourf.collections[0].set_alpha(0)

# Convert matplotlib contour to geojson
geojson = geojsoncontour.contourf_to_geojson(
    contourf=contourf,
    geojson_filepath='./Dkde_plot.geojson',
    min_angle_deg=3.0,
    ndigits=3,
    fill_opacity=0.5
)

# まとめ

2次元カーネルの描画を実行しました。

Jupyter Notebookでコマンドラインを実行する

Jupyter Notebookでコマンドラインを実行する

Jupyter Notebookでコマンドラインを実行します.

ColabratryでSeleniumを復活させる(2023年1月24日)

ColabratryでSeleniumを復活させる(2023年1月24日)

ColabratryでSeleniumを復活させる(2023年1月24日)