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

时间:2016-09-06 17:41:02

标签: excel label scatter-plot

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

这可能吗?没有VBA的解决方案的奖金。

以下重叠标签的示例:

enter image description here

1 个答案:

答案 0 :(得分:4)

这是一个非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$2:D2)<0.75)*($E$2:E2=E2))>1),E2,NA())

此公式创建带有点上方标签的系列。该公式进行了两项检查:

  1. 检查是否有任何其他要点&#34;关闭&#34;并且低于当前点。
  2. 检查是否有任何先前的点&#34;关闭&#34;并达到目前的水平。 (对于此检查,我们无法与所有点进行比较,否则两个点都将在该点之上具有标签。我们仅检查当前点,以便第一个点仍然具有下面的标签,并且后续点具有上面的标签。 )
  3. 如果满足其中任何一个条件,则使用该值,否则使用NA()(因此不显示任何点)。

    在此公式中,close定义为&#34; 0.75&#34;在X轴和Y轴上。您需要根据&#34;关闭&#34;更改公式中的这些值。在你的数据中。即X和Y值的差异要求标签放置在点的相对侧。

    然后该公式进入G2以创建具有点下方标签的系列,这是所有剩余值:

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

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

    现在,使用2个系列创建散点图:

    系列1使用X和Y以上

    系列2使用X和Y

    (这些数据系列中不需要包含空行)

    将所有细节中的两个系列格式化为相同,但系列1的标签显示在点上方,而系列2的标签显示在点下方。

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

    所有要点:

    All points

    过滤&#34; a&#34;

    Filtered a

    过滤&#34; b&#34;

    Filtered b

    编辑:我们实际上可以使公式更智能地处理多个近似值。这将在上面和下面的标签之间交替每个后续值。但是,它只适用于所有值都在&#34; close&#34;范围,仅当数据按X排序时才

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

    Multiple close level points