Excel 2013:标记散点图中的标签冲突消除

Excel 2013: Label deconfliction in labeled scatter plot

在 Excel 2013 年,我用单元格的值标记散点图。我希望标签不重叠。我可以手动移动标签,但我已经创建了一个过滤器来自动创建新图,所以我希望标签冲突也能自动发生。

这可能吗?没有 VBA.

的解决方案的奖励

下面重叠标签的示例:

这是一个非VBA 的解决方案,如果没有太多的点并且值的范围相当稳定,它就可以工作。

它的工作原理是将您的 Y 系列分成两个单独的系列,一个在点上方有标签,一个在点下方有标签。

默认情况下,点将被放入系列中,标签位于点下方。但是,对于每个点,拆分公式都会检查附近是否有另一个点低于或等于当前点。如果有,则将当前点放入该点上方带有标签的系列中。

我假设您有 3 列数据:筛选器、X、Y。(如果您只是筛选 X 或 Y,这也适用,您可以忽略筛选器列)

需要四个工作柱。前两个是 X Filtered 和 Y Filtered。

使用下面我的屏幕截图中的示例,此公式进入 D2 并填充 D 和 E 列:

=SUBTOTAL(9,B2)

如果数据点被过滤掉,这只会导致数据点变为 0,0,以便在拆分公式中忽略它们。

为了便于阅读,将筛选值的名称设置为 X (D2:D10) 和 Y (E2:E10)

然后这个公式作为数组公式进入F2,用CTRL + SHIFT + ENTER输入,然后往下填

=IF(SUM((ABS(D2-X)<0.75)*(E2-Y>0)*(E2-Y<0.75))+(SUM((ABS(D2-$D:D2)<0.75)*($E:E2=E2))>1),E2,NA())

这个公式创建了标签在点上方的系列。该公式进行两项检查:

  1. 检查是否有任何其他点在 "close" 和低于当前点。
  2. 检查是否有任何先前的点 "close" 并且与当前点平齐。 (对于此检查,我们无法比较所有点,否则两个点的标签都在该点上方。我们只检查当前点,以便第一个点仍然在下方有标签,后续点在上方有标签。)

如果满足其中任何一个条件,则使用该值,否则使用 NA()(因此不显示任何点)。

在此公式中,收盘价在 X 轴和 Y 轴上均定义为“0.75”。您需要根据数据中 "close" 的内容更改公式中的这些值。 IE。 X 和 Y 值的差异需要将标签放置在点的相对侧。

此公式然后进入 G2 以创建标签低于该点的系列,即所有剩余值:

=IF(ISERROR(F2),E2,NA())

只需要一个技巧就可以使自动过滤器处理数据。因为我们使用了 SUBTOTAL 公式,Excel 认为最后一行是小计行并自动将其从自动过滤器中排除,即使我们在应用自动过滤器之前 select 所有数据也是如此。要使用自动筛选器,您实际上需要在创建自动筛选器之前创建一个没有小计功能的额外虚拟行。

现在,创建包含 2 个系列的散点图:

系列 1 使用上面的 X 和 Y

系列 2 使用下方的 X 和 Y

(无需在这些数据系列中包含空行)

将两个系列的格式设置为在所有细节上都相同,除了系列 1 的标签显示在点上方,系列 2 的标签显示在点下方。

我下面的屏幕截图显示了结果,包括过滤时的结果。标签将始终低于值,除非附近有另一个可见点。每个屏幕截图还显示了其中一个公式。

所有积分:

过滤 "a"

过滤 "b"

编辑:我们实际上可以使公式更智能一些以处理多个收盘价。这将在标签上方和下方交替显示每个后续值。但是,它仅在所有值都在 "close" 范围内并且仅当数据按 X 优先排序时才有效

=IF(SUM((ABS(D2-X)<0.75)*(E2-Y>0)*(E2-Y<0.75))+(MOD(SUM((ABS(D2-$D:D2)<0.75)*($E:E2=E2)),2)=0),E2,NA())