2017-10-17 7 views
2

青い円で囲むために各赤い点をテストしようとしています。しかし、私のサークルのパスには、包含テストが意図したとおりに動作しなくなっていると思われるいくつかの奇妙な値があります。Matplotlibサークルの頂点が範囲外にある

以下のコードの軸リストは、それぞれ経度と緯度の最大&分を表しています。円が正しい場所にプロットされているとすれば、私はそのパスがその範囲内の頂点を持つことを期待しています。

どこが間違っていますか?

from matplotlib.patches import Ellipse 
import matplotlib.path as mpltPath 

axis = [4.7469287189121001, 5.0340994897259534, 52.282706941081258, 52.432452803031282] 

unitX = (axis[1]-axis[0])/10 
unitY = (axis[3]-axis[2])/10 

fig, ax = plt.subplots(figsize=(8, 6)) 

for i, s in enumerate(housing_prices_shapes['2015']): 
    ax.plot(s[:,0], s[:,1], linewidth=0.5, c='0.5') 

circle = Ellipse(housing_prices_shapes['2015'][0][0], width=unitX, height=unitY, edgecolor='b', facecolor='None') 

ax.add_patch(circle) 

listings_coordinates = airbnb_prices['2015'][["longitude", "latitude"]] 

path_temp = circle.get_path() 
transform = circle.get_transform() 

new_path = transform.transform_path(path_temp) 

path = mpltPath.Path(new_path.vertices) 
flag = path.contains_points(listings_coordinates) 

ax.scatter(listings_coordinates['longitude'].values, listings_coordinates['latitude'].values, c='r', s=0.5) 

以下のように円プリントを作成するために使用される各値:

print(housing_prices_shapes['2015'][0][0], unitX, unitY) 
[ 4.94147517 52.3670552 ] 0.028717077081385333 0.01497458619500236 

方法オフになっている私は、このような経度と緯度の印刷と同じ範囲にあることが予想されるパス変数:

print(new_path.vertices) 
array([[ 374.41773395, 221.41011283], 
    [ 380.33706714, 221.41011283], 
    [ 386.01475666, 223.12842659], 
    [ 390.2003573 , 226.18661544], 
    [ 394.38595794, 229.24480429], 
    [ 396.73773395, 233.39318067], 
    [ 396.73773395, 237.71811283], 
    [ 396.73773395, 242.04304498], 
    [ 394.38595794, 246.19142136], 
    [ 390.2003573 , 249.24961022], 
    [ 386.01475666, 252.30779907], 
    [ 380.33706714, 254.02611283], 
    [ 374.41773395, 254.02611283], 
    [ 368.49840076, 254.02611283], 
    [ 362.82071123, 252.30779907], 
    [ 358.63511059, 249.24961022], 
    [ 354.44950995, 246.19142136], 
    [ 352.09773395, 242.04304498], 
    [ 352.09773395, 237.71811283], 
    [ 352.09773395, 233.39318067], 
    [ 354.44950995, 229.24480429], 
    [ 358.63511059, 226.18661544], 
    [ 362.82071123, 223.12842659], 
    [ 368.49840076, 221.41011283], 
    [ 374.41773395, 221.41011283], 
    [ 374.41773395, 221.41011283]]) 

そして、もちろん何のポイントはTrueとしてフラグ付けされていません:

print(any(flag)) 
False 

Amsterdam

+1

'new_path = transform.transform_path(path_temp)'を使ってパスを表示座標に変換します。私はこれがすべてここで望ましくないと思う。望ましくない行動についての質問をするときに[mcve]を提供してください。さもなければ、正確な答えは与えられない。 – ImportanceOfBeingErnest

答えて

0

ImportanceOfBeingErnest noted in a commentとして、あなたはあなたの楕円パスを変換するべきではありません。さて、変換されていないパスを使用することは、直接役に立ちません。おそらくcircle.get_verts()を利用することができます。

しかし、私はあなたのゴルドの結び目を切り抜けましょう:あなたの楕円の中に落ちることを明示的にテストしないのはなぜですか?中央(x0,y0)と長さabの半軸と楕円の方程式は

(x-x0)^2/a^2 + (y-y0)^2/b^2 = 1 

であり、楕円の内側には、その後、不平等

(x-x0)^2/a^2 + (y-y0)^2/b^2 < 1 

によって定義されていることを確認するために本当に簡単です(これを円で見るのは簡単ですし、楕円をその軸の1つに沿って線形変換を行った円として考えることができます)。

論理インデックスを使用して、楕円の内側にある点を見つけてください!あなたが注意する必要がある唯一のものはEllipseに渡されたパラメータが2*a2*bであるということです。今

points = airbnb_prices['2015'][['longitude', 'latitude']] # shape (N,2) 
center = housing_prices_shapes['2015'][0][0] # shape (2,) broadcasts to (N,2) 
a = unitX/2 # scalar 
b = unitY/2 # scalar 

# make use of broadcasting while we're at it 
flag = ((points-center)**2/np.array([a,b])**2).sum(axis=1) < 1 

flagはshape- (N,)論理配列である、あなたの元のコールから予想されるように同じ形状と大きさ、すなわち〜contains_points

関連する問題