背景
2次元の座標情報をヒートマップとして出力したいと思った.
最も簡単に出力すると点にのみ意味を持たせるだけで,間の値の情報を表現することはできない.
位置座標のような点の間が重要なデータの場合,間を補完して表示することで,見える情報があると思う.
そこで,scipyの線形補完を利用して,点間の値を補完したヒートマップを作成してみる.
プログラム言語は使い慣れているpythonを利用する.
方法:scipy.interpolateのgriddata
scipy.interpolate.griddata
を用いることで,2次元座標上にある離散値を連続値になるように点間の値を補完する.
関数の引数
from scipy.interpolate import griddata
output = griddata(points, values, xi, method='linear')
# points:座標を持つ配列
# values:pointsの値を持つ配列
# xi:補完対象となる座標を持つ配列
# method:
# nearest:補完する点にもっと近い値を返す
# linear:線形補完
# cubic:曲線補完
実際に近いデータで試してみる
点群データの作成
まずは座標と値を持ったデータ列を作成する
データ
x = [3,3,3,6,6,6,9,9,9]
y = [3,6,9,3,6,9,3,6,9]
values = [1,2,3,9,5,6,7,8,9]
補完なしでプロット
補完なし表示
# 散布図としてプロット
plt.scatter(x, y, c=values, cmap='Blues', s=100)
plt.colorbar()
plt.xlabel('x座標')
plt.ylabel('Y座標')
plt.title('テスト')
plt.show()
右の方に行くにつれて大きい値が並んでいることが分かりやすくなった.
点群の補完
点群の補完
# 補完対象となる点座標を作成
xi = np.linspace(min(x), max(x), 100)
yi = np.linspace(min(y), max(y), 100)
xi, yi = np.meshgrid(xi, yi)
# 点間の補完を行う
zi = griddata((x, y), values, (xi, yi), method='linear')
補完した情報をプロット
補完あり表示
# プロット
plt.figure(figsize=(8, 6))
plt.imshow(zi, extent=(min(x), max(x), min(y), max(y)), origin='lower', cmap='Blues')
plt.colorbar()
plt.xlabel('x座標')
plt.ylabel('Y座標')
plt.title('テスト')
plt.show()
3つの保管方法で比較した.
nearest
だと最も近い点の値をそのまま参照するため,線を引くような形になる.
linear
とcubic
を比較すると,cubic
の方がより滑らかに保管している.
分析する実データによって使い分ける必要がありそうだと思った.