首页 > 解决方案 > 删除位于特定区域内的点 - python

问题描述

我正在尝试删除位于特定区域内的点。使用下面,我希望删除位于蓝色框中的点。理想情况下,我会绘制一个更接近圆形轮廓的多边形。这只是一个粗略的描述。

我目前正在将一个粗略的子集应用于 y 坐标:

df = df[df['A'] > 0]
df = df[df['C'] > 0]

虽然这获得了大部分分数,但我希望改进该方法。

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

df = pd.DataFrame(np.random.randint(-25,125,size=(500, 4)), columns=list('ABCD'))
fig, ax = plt.subplots()

ax.set_xlim(-50, 150)
ax.set_ylim(-50, 150)

x = ([1.25,0.5,-0.25,0.5,1.25,-10,-10,1.25]) 
y = ([75,62.5,50,37.5,25,25,75,75])
plt.plot(x,y)

A = df['A']
B = df['B']

C = df['C']
D = df['D']

plt.scatter(df['A'], df['B'], color = 'purple', alpha = 0.2); 
plt.scatter(df['C'], df['D'], color = 'orange', alpha = 0.2); 

Oval_patch = mpl.patches.Ellipse((50,50), 100, 150, color = 'k', fill = False)

ax.add_patch(Oval_patch)

标签: pythonpandas

解决方案


我建议将您的多边形(<Line2D object>)存储在这样的变量中:

line = plt.plot(x,y)

这使您能够利用get_path() 方法来获取底层路径对象,该对象具有内置的contains_points() 方法

接下来,包括以下几行:

pts = df[['C','D']]
mask = line[0].get_path().contains_points(pts)
plt.scatter(df['C'][mask],df['D'][mask],color="red",zorder=10)

并且您应该能够验证掩码是否选择了正确的点:

以红色突出显示的掩蔽点

现在,要删除所选区域内的点,您可以使用~mask否定布尔掩码,即使用:

pts = df[['A','B']]
mask_ab = line[0].get_path().contains_points(pts)
pts = df[['C','D']]
mask_cd = line[0].get_path().contains_points(pts)

plt.scatter(df['A'][~mask_ab], df['B'][~mask_ab], color = 'purple', alpha = 0.2) 
plt.scatter(df['C'][~mask_cd], df['D'][~mask_cd], color = 'orange', alpha = 0.2)

得到这个结果:

被屏蔽的点被移除


推荐阅读