我有一个scatter plot
,它被排序为4 Bins
。它们由中间的两个arcs
和一个line
隔开(见下图)。在
这两个arcs
有一个小问题。如果X-Coordiante
大于ang2
,则不会将其归因于正确的Bin
。(见下图)
import math
import matplotlib.pyplot as plt
import matplotlib as mpl
X = [24,15,71,72,6,13,77,52,52,62,46,43,31,35,41]
Y = [94,61,76,83,69,86,78,57,45,94,82,74,56,70,94]
fig, ax = plt.subplots()
ax.set_xlim(-100,100)
ax.set_ylim(-40,140)
ax.grid(False)
plt.scatter(X,Y)
#middle line
BIN_23_X = 0
#two arcs
ang1 = -60, 60
ang2 = 60, 60
angle = math.degrees(math.acos(2/9.15))
E_xy = 0,60
Halfway = mpl.lines.Line2D((BIN_23_X,BIN_23_X), (0,125), color = 'white', lw = 1.5, alpha = 0.8, zorder = 1)
arc1 = mpl.patches.Arc(ang1, 70, 110, angle = 0, theta2 = angle, theta1 = 360-angle, color = 'white', lw = 2)
arc2 = mpl.patches.Arc(ang2, 70, 110, angle = 0, theta2 = 180+angle, theta1 = 180-angle, color = 'white', lw = 2)
Oval = mpl.patches.Ellipse(E_xy, 160, 130, lw = 3, edgecolor = 'black', color = 'white', alpha = 0.2)
ax.add_line(Halfway)
ax.add_patch(arc1)
ax.add_patch(arc2)
ax.add_patch(Oval)
#Sorting the coordinates into bins
def get_nearest_arc_vert(x, y, arc_vertices):
err = (arc_vertices[:,0] - x)**2 + (arc_vertices[:,1] - y)**2
nearest = (arc_vertices[err == min(err)])[0]
return nearest
arc1v = ax.transData.inverted().transform(arc1.get_verts())
arc2v = ax.transData.inverted().transform(arc2.get_verts())
def classify_pointset(vx, vy):
bins = {(k+1):[] for k in range(4)}
for (x,y) in zip(vx, vy):
nx1, ny1 = get_nearest_arc_vert(x, y, arc1v)
nx2, ny2 = get_nearest_arc_vert(x, y, arc2v)
if x < nx1:
bins[1].append((x,y))
elif x > nx2:
bins[4].append((x,y))
else:
if x < BIN_23_X:
bins[2].append((x,y))
else:
bins[3].append((x,y))
return bins
#Bins Output
bins_red = classify_pointset(X,Y)
all_points = [None] * 5
for bin_key in [1,2,3,4]:
all_points[bin_key] = bins_red[bin_key]
输出:
^{pr2}$这不太正确。看看下面的figure output
,4 coordinates
在Bin 3
中,11
在{8
属于Bin 3
,而{
我认为问题是blue coordinates
。具体地说,当X-Coordinate
大于ang2
,即60
。如果我将这些更改为小于60
,它们将被更正为Bin 3
。在
我不确定是否应该将arcs
扩展到大于60
,或者代码是否可以改进?在
请注意,这只是Bin 4
和ang2
。此问题将出现在Bin 1
和ang1
中。也就是说,如果X-coorridate小于60,它就不会归属于Bin 1
预期输出:
[[], [], [(24, 94), (15, 61), (6, 69), (13, 86)], [(71, 76), (72, 83), (52, 57), (52, 45), (46, 82), (43, 74), (31, 56), (35, 70), (41, 94), (77, 78), (62, 94)]]
注:首选预期输出。该示例使用一个row
的输入数据。但是,我的数据集要大得多。如果我们使用多个rows
,那么输出应该是逐行的。e、 g
#Numerous rows
X = np.random.randint(50, size=(100, 10))
Y = np.random.randint(80, size=(100, 10))
输出:
Row 0 = [(x,y)],[(x,y)],[(x,y)],[(x,y)]
Row 1 = [(x,y)],[(x,y)],[(x,y)],[(x,y)]
Row 2 = [(x,y)],[(x,y)],[(x,y)],[(x,y)]
etc
补丁有一个测试是否包含点:
contains_point
,甚至包括点数组:contains_points
我有一个代码片段给你,你可以在添加补丁的部分和
#Sorting the coordinates into bins
代码块之间添加。在它添加两个额外的(透明的)椭圆,用于计算如果圆弧是完全闭合的椭圆,这些圆弧是否包含点。如果一个点属于大椭圆,左或右省略号,或者具有正或负的x坐标,那么您的bin计算只是一个布尔测试组合。在
输出为:
^{pr2}$注意,当点的x-coord=0时,您仍然应该决定如何定义bin—此时它们等于outside,因为}都不觉得对它们负责。。。在
on_left
和{PS:感谢@ImportanceOfBeingErnest提供了必要转换的提示:https://stackoverflow.com/a/49112347/8300135
注意:对于以下所有编辑,您需要
import numpy as np
编辑: 计算每个
X, Y
数组输入的bin分布的函数:将导致以下结果:
编辑2: X和Y的两个二维数组中的许多行:
在所有行上循环:
结果:
编辑3: 若要返回的不是每个bin中的点数,而是包含四个数组的数组,其中包含每个bin中点的x、y坐标,请使用以下命令:
…同样,要将此应用于大型2D数组,只需迭代它们:
这是一个我把它分成省略号的版本。由于OP使用的是简单的几何形状,因此可以用一个简单的公式来测试,即不必“询问”补丁。我将它推广到n个弧,但有一个小缺点,即bin编号不是从左到右,但这可以在其他地方处理。 输出为类型
即每个箱子的x、y清单。这里的编号是从-3到3,0在外面。在
^{pr2}$显示
注意,我使用了关于x=0的对称性。如果省略号相对于x移动,则代码必须稍作修改。 还要注意,提供省略号的顺序很重要!在
相关问题 更多 >
编程相关推荐