質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

443閲覧

座標をもつ2次元の平面分布図の作成

reado

総合スコア6

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/08/18 15:48

実現したいこと

緯度・経度・測定値の入ったデータのグリッドマップを作成したいのですが、同じグリッド内に複数のデータが存在しており、それらの平均値を表示したいです。

前提

緯度・経度に従ってx,y座標は0~10のレンジで自分で設定しており、meshgrid関数を用いてグリッド化しました(グリッド数は10×10)。
plt.contourf(x座標, y座標, 測定値)で図示していますが、滑しすぎているため、同じグリッド内の測定値を平均化したいです。

(2,5,z1),(2,5,z2),(4,8,z3),(2,5,z4),(6,1,z4)...のようなデータセットです。

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3from scipy.interpolate import griddata 4x = np.array(x_grid) 5y = np.array(y_grid) 6z = np.array(data['measurement']) 7xmin = x.min() 8xmax = x.max() 9ymin = y.min() 10ymax = y.max() 11msize = 1 12ax = np.arange(xmin,xmax,msize) 13ay = np.arange(ymin,ymax,msize) 14xx, yy = np.meshgrid(ax, ay) 15nz = griddata((x, y), z, (xx, yy)) 16cont=plt.contourf(xx, yy, nz, cmap="jet") 17plt.show()

試したこと

10×10のグリッドをナンバリングし、同じ番号に該当するデータを抜き出して平均しようと思いましたが、どのように同じ番号にしたらよいかわかりませんでした。その他の方法が思いつかないため、ご質問させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/08/19 00:15

10x10のグリッドには必ず1つ以上のデータが収まっている状態でしょうか?データ欠損がある場合、平均化も必要かもしれませんが補完のような操作も必要になります。このほかにもし分布に傾向があるのであれば、数学的に出す方法以外に、機械学習的に出す方法も出てきたりします。 データの素性をもう少し話せる範囲で開示していただけるといいコメントがもらいやすいと思います。
reado

2023/08/22 05:21

1つ以上のデータが収まっているわけではなかったので、空のカラムを作成し、その上から代入することとしました。 ダミーデータの作成、ありがとうございました。
guest

回答1

0

ベストアンサー

適当にデータを作って実装しました

質問に生データが掲載されていなかったため、

  1. 正規分布するダミーデータを手本とし、ランダムな座標にノイズを乗せたものを1000点用意(n=1000のデータセットの代わり)
  2. n=1000のデータセットに対して、座標ごとに平均値を求めてプロット

によって実装しました。

Python3

1# モジュール群をインポートする 2import numpy as np 3import pandas as pd 4import matplotlib.pyplot as plt

1.正規分布するダミーデータを手本とし(略)

Python3

1# メッシュの大きさを定義する 2i_lat = 10 # 緯度 3i_lon = 10 # 経度 4 5# 1. まずダミーデータを作る 6 7# 1.1 ランダム値を付与する前の元になる2次元正規分布を定義する 8# 見た目が分かりやすい例として、中心部分が一番高くなる分布をつくる 9kernel = np.zeros((i_lat, i_lon)) 10center = (int(i_lat/2), int(i_lon/2)) 11sigma = 3 12for i in range(i_lat): 13 for j in range(i_lon): 14 kernel[i][j] = np.exp(-(i - center[0]) ** 2 / (2 * sigma ** 2)) + np.exp(-(j - center[1]) ** 2 / (2 * sigma ** 2)) 15 16# 数字が分かりやすい範囲になるように標準化する 17kernel = kernel- np.min(kernel) 18kernel = kernel / np.max(kernel) 19 20# # ノイズを乗せる前の結果を表示する 21# plt.imshow(pd.DataFrame(kernel), cmap="jet") 22# plt.colorbar() 23# plt.show() 24 25# 1.2 カーネルのランダムな座標にランダムな値を付与して、i_max個のノイズ付きのデータを作る 26 27# 緯度、経度、高さを格納するDFを用意する 28df = pd.DataFrame(columns=["lat","lon","alt"]) 29 30i_max = 1000 #ランダム座標の生成回数 31for i in range(i_max): 32 # ランダム座標の生成 33 lat = np.random.randint(i_lat) 34 lon = np.random.randint(i_lon) 35 36 # カーネルのランダムな位置の値に対して、ノイズを乗せた値を作る 37 alt_rand = kernel[lat][lon] + np.random.normal(0,0.1) 38 39 # DFにデータを追加する 40 df = pd.concat([df,pd.DataFrame({"lat":[lat],"lon":[lon],"alt":[alt_rand]})]) 41 42# 生成したダミーデータ 43print(df)

ここまでの処理で、

PlainText

1 lat lon alt 20 6 3 0.932370 30 9 9 0.175635 40 6 9 0.637622 50 5 5 1.089081 60 4 1 0.491168 7.. .. .. ... 80 7 6 0.866969 90 7 6 0.963478 100 9 3 0.672626 110 0 6 0.615814 120 7 4 0.747753 13[1000 rows x 3 columns]

という感じでLAT,LON,ALTの3軸のダミーデータが1000個得られます。
そのままではプロットできないので、このあとでLATとLOC毎にALTの平均値を計算します。

2.2. n=1000のデータセットに対して(略)

Python3

1# 2. ダミーデータの座標ごとにaltの平均値を得る 2df_alt = df.groupby(["lat", "lon"]).mean().values.reshape(i_lat, i_lon) 3 4plt.imshow(df_alt, cmap="jet") 5plt.colorbar() 6plt.show()

イメージ説明

投稿2023/08/19 07:07

編集2023/08/19 07:09
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reado

2023/08/22 05:20

ありがとうございました!!参考にさせて頂き、思い通りの図が書けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問