2017-10-17 50 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()

但讓我切開你的Gordian結:爲什麼不明確地測試你的橢圓內?與中心(x0,y0)和長度a的半軸和b橢圓的方程式是

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

和它的真正簡單地看到,橢圓的內部,然後由不等式

(x-x0)^2/a^2 + (y-y0)^2/b^2 < 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是從原來的通話預期形狀 - (N,)邏輯陣列,即相同的形狀和大小到contains_points