1
2

値を持つ座標群からヒートマップを表示

Last updated at Posted at 2023-12-04

背景

2次元の座標情報をヒートマップとして出力したいと思った.

ヒートマップ概要.png

最も簡単に出力すると点にのみ意味を持たせるだけで,間の値の情報を表現することはできない.
位置座標のような点の間が重要なデータの場合,間を補完して表示することで,見える情報があると思う.

そこで,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()

before_output.png

右の方に行くにつれて大きい値が並んでいることが分かりやすくなった.

点群の補完

点群の補完
# 補完対象となる点座標を作成
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()

after_output_nearest.pngafter_output_linear.pngafter_output_cubic.png

3つの保管方法で比較した.

nearestだと最も近い点の値をそのまま参照するため,線を引くような形になる.
linearcubicを比較すると,cubicの方がより滑らかに保管している.
分析する実データによって使い分ける必要がありそうだと思った.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2