我想以编程方式测试两个散点图字形是否会在matplotlib中重叠。所以给出一对(x,y)坐标和一个大小(据我所知是圆的面积,以点为单位),我想绘制
plt.scatter(x, y, s=s)
然后有一个名为points_overlap
的函数,它接受这些参数,如果点重叠则返回True
,否则返回False
。
def points_overlap(x, y, s):
if ...
return True
else:
return False
我知道在不同的matplotlib coordinate systems之间有转换矩阵,但我无法找到编写此函数的正确步骤。
答案 0 :(得分:2)
这需要一些测试,但它可能有用吗?这些都应该在显示空间
def overlap(x, y, sx, sy):
return np.linalg.norm(x - y) < np.linalg.norm(sx + sy)
试验:
In [227]: X = np.array([[1, 1], [2, 1], [2.5, 1]])
In [228]: s = np.array([20, 10000, 10000])
In [229]: fig, ax = plt.subplots()
In [230]: ax.scatter(X[:, 0], X[:, 1], s=s)
Out[230]: <matplotlib.collections.PathCollection at 0x10c32f28>
In [231]: plt.draw()
测试每一对:
Xt = ax.transData.transform(X)
st = np.sqrt(s)
pairs = product(Xt, Xt)
sizes = product(st, st)
for i, ((x, y), (sx, sy)) in enumerate(zip(pairs, sizes)):
h = i % 3
j = i // 3
if h != j and overlap(x, y, sx, sy):
print((i, h, j))
还有很大的改进空间。转换所有数据并将其传递到points_overlap
函数而不是在内部进行转换可能更容易。那实际上要好得多。