【发布时间】:2014-10-20 09:34:25
【问题描述】:
我有一个带有多个点的散点图。每个点都有一个与之关联的字符串(长度不同),我想提供一个标签,但我不能全部适合它们。所以我想从最重要到最不重要迭代我的数据点,并且在每种情况下,只有当它不会与现有标签重叠时才应用标签。字符串的长度不同。其中一位评论者提到解决背包问题以找到最佳解决方案。在我的例子中,贪心算法(总是标记最重要的剩余点,可以标记而不重叠)将是一个好的开始,可能就足够了。
这是一个玩具示例。我可以让 Python 在不重叠的情况下只标记尽可能多的点吗?
import matplotlib.pylab as plt, numpy as np
npoints = 100
xs = np.random.rand(npoints)
ys = np.random.rand(npoints)
plt.scatter(xs, ys)
labels = iter(dir(np))
for x, y, in zip(xs, ys):
# Ideally I'd condition the next line on whether or not the new label would overlap with an existing one
plt.annotate(labels.next(), xy = (x, y))
plt.show()
【问题讨论】:
-
简而言之,不,这不是内置的(无论如何,找到最佳标签集让我觉得是背包问题的一种变体......)。您可能会跟踪您添加的所有文本,然后检查 bbox 是否重叠,但是文本对象在绘制之前不知道它们有多大,因此这可能会变得非常昂贵。
-
Here 您可能会找到实现此类自动标签放置所需的一切。但这不是微不足道的。
-
@tcaswell,你说绘制需要绘制文本框以找出它们有多大会“昂贵”。你是指计算时间吗?我现在有代码可以标记所有只需一两秒钟即可运行的点。即使是我最棘手的用例也只有几千分。
-
足够的重新计算时间。文本渲染是瓶颈之一,但我正在考虑尝试进行动画/实时绘图,就人力时间而言,它仍然非常快。在我打字之前我应该再想一想。
标签: python matplotlib scatter-plot