2017-10-30 19 views
0

matplotlib.pyplotを使用してデータを補間し、等高線を作成しています。 this答え/例(等高線内でエリアを計算する方法について)、私は等高線の頂点を得ることができます。 2つの指定された輪郭の間のポイント数をカウントするために、その情報、つまり線の頂点を使用する方法はありますか?これらの点は、輪郭の導出に使用されるデータとは異なります。Pythonで2等高線間のポイント数を計算するには

答えて

1

通常、プロットをリバースエンジニアリングしてデータを取得する必要はありません。その代わりに、後で輪郭をプロットするために使用される配列を補間して、ある点の領域にある点を見つけることができます。

以下は、レベルが-0.8-0.4の間のすべてのポイントを見つけて印刷し、プロット上に赤で表示します。

import numpy as np; np.random.seed(1) 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 
from scipy.interpolate import Rbf 

X, Y = np.meshgrid(np.arange(-3.0, 3.0, 0.1), np.arange(-2.4, 1.0, 0.1)) 
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
Z = 10.0 * (Z2 - Z1) 

points = np.random.randn(15,2)/1.2 
levels = [-1.2, -0.8,-0.4,-0.2] 

# interpolate points 
f = Rbf(X.flatten(), Y.flatten(), Z.flatten()) 
zi = f(points[:,0], points[:,1]) 
# add interpolated points to array with columns x,y,z 
points3d = np.zeros((points.shape[0],3)) 
points3d[:,:2] = points 
points3d[:,2] = zi 
# masking condition for points between levels 
filt = (zi>levels[1]) & (zi <levels[2]) 
# print points between the second and third level 
print(points3d[filt,:]) 

### plotting 
fig, ax = plt.subplots() 

CS = ax.contour(X, Y, Z, levels=levels) 
ax.clabel(CS, inline=1, fontsize=10) 
#plot points between the second and third level in red: 
ax.scatter(points[:,0], points[:,1], c=filt.astype(float), cmap="bwr") 

plt.show() 

enter image description here

+0

お返事ありがとうございます。私はそれが私の目標をより明確に表現する助けになると思います:私はプロットをリバースエンジニアリングする必要はありません。代わりに、私は、X、Y、Zが分かっている配列/データセットから得られた2つの等高線を使いたいと思います。私のZ値は時間のかかるモデルの実行から来ているので、私が知りたいのは、(正確な位置ではなく)輪郭のどの辺にあるのか知っていれば、新しいアレイのモデルを再度実行することを避けることができます代わりに既存の輪郭の頂点を使用します。それはより良い意味ですか? –

+0

確かに、上記はまったく同じことではありませんか? – ImportanceOfBeingErnest

+0

マスクを使用してそれらをフィルタリングできるようにするには、例のZの値を知る必要があるようです。私は私の配列の1つのみに対してZを持っていますが、残っているものではありません。ここに明白なものがないと私は許してくれますか? –

1

どの点をチェックしたいのか分かりませんが、線の頂点(2点)があり、3点が2点の間にあるかどうかを確認したい場合は、単純な(効率的ではない)手法を用いて、3つの三角形によって形成される三角形の面積を計算する。領域が0の場合、点は同じ行になります。また、ポイント間の距離を計算し、ポイントがライン上または外側(延長線上)にあるかどうかを確認することもできます。

希望すると便利です。

+0

はい、私は、「第三のポイントは、」私は数える/チェックする程度20-40K点のセットを持っている以外、両者の間に落ちるかどうかをチェック話しています。あなたのコメントはそれについてもう少し考えるのに役立ちますが、私はライン(x、y頂点の1つだけでなく)と多くのポイントについてこれを行う方法を概念化するのが難しいです。ありがとう! –

関連する問題