如何在matplotlib中将散点大小转换为数据坐标?

mwa*_*kom 6 python matplotlib

我想以编程方式测试两个散点图字形是否会在matplotlib中重叠.所以给出一对(x,y)坐标和一个大小(据我所知是圆的面积,以点为单位),我想绘制

plt.scatter(x, y, s=s)
Run Code Online (Sandbox Code Playgroud)

然后有一个调用的函数points_overlap,它接受这些参数,True如果这些点重叠False则返回.

def points_overlap(x, y, s):
    if ...
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

我知道在不同的matplotlib坐标系之间有转换矩阵,但是我无法找到编写这个函数的正确步骤.

Tom*_*ger 1

这需要一些测试,但它可能有效吗?这些都应该在显示空间中

def overlap(x, y, sx, sy):
    return np.linalg.norm(x - y) < np.linalg.norm(sx + sy)
Run Code Online (Sandbox Code Playgroud)

测试:

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()
Run Code Online (Sandbox Code Playgroud)

测试每一对:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

还有很大的改进空间。转换所有数据并将其传递到points_overlap函数中而不是在内部进行转换可能更容易。其实这样会好很多。