python - 删除位于特定区域内的点 - 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)
解决方案
我建议将您的多边形(<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)
得到这个结果:
推荐阅读
- php - PHP 将字符串转换为 int 内存使用情况:我应该将字符串数字转换为 int 数字吗?
- ionic-framework - 修复 TS2345:“HTMLElement”类型的参数不可分配给“HTMLInputElement”类型的参数
- mysql - 为什么在 AWS(Lightsail 和 EC2)上运行的 Ubuntu 18.04 上安装 MYSQL 服务器后出现 ssh 连接错误?
- java - 运行按钮显示为灰色 - intellij
- python - 在 Blender 的 Python 中安装 Dlib 时出错
- c - 如何编写在程序上执行 gdb 的 bash 脚本
- javascript - 在 JavaScript 中的属性数组中嵌套属性
- oracle - 在 SQL Developer 中命名已经存在的错误
- c++ - 使用while循环从.txt文件输出行时遇到问题,txt文件的每个单词都从新行开始
- avro - Kafka Streams:序列化回 avro