作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想以编程方式测试两个散点图字形是否会在 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 之间,但我想不出编写此函数的正确步骤。
最佳答案
这需要一些测试,但它可能有效吗?这些都应该在显示空间
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
函数而不是在内部进行转换可能更容易。实际上会好得多。
关于python - 如何在 matplotlib 中将散点大小转换为数据坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27258886/
我是一名优秀的程序员,十分优秀!