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

时间:2014-12-02 21:01:54

标签: python matplotlib

我想以编程方式测试两个散点图字形是否会在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之间有转换矩阵,但我无法找到编写此函数的正确步骤。

1 个答案:

答案 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))

enter image description here

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