ggplot2: 如果位置为“fill”,如何在条形图上添加标签

4
我希望在一张填充的条形图上添加百分比数字。这是错误放置标签的图表示例:

enter image description here

这是数据框:
x0 <- expand.grid(grp    = c("G1","G2")
                 , treat = c("T1","T2")
                 , out   = c("out1","out2","out3","out4")
)
set.seed(1234)
x0$n <- round(runif(16,0,1)*100,0)
head(x0)
  grp treat  out  n
1  G1    T1 out1 11
2  G2    T1 out1 62
3  G1    T2 out1 61
4  G2    T2 out1 62
5  G1    T1 out2 86
6  G2    T1 out2 64

现在,我将组/处理内的总和添加到数据框中(使用 SQL,抱歉!):
x0 <- sqldf(paste("SELECT a.*, (SELECT SUM(n)"
                  ,"            FROM x0 b"
                  ,"            WHERE a.grp = b.grp"
                  ,"                  AND a.treat = b.treat"
                  ,"           ) tot"
                  ," FROM x0 a"
                  ," ORDER BY a.grp,a.treat,a.out"
                  )
            )
x0$p <- with(x0, n/tot)
x0$p2 <- with(x0, paste(formatC(p*100, digits=2
              , format="fg"),"%",sep=""))
head(x0)
  grp treat  out  n tot          p    p2
1  G1    T1 out1 11 192 0.05729167  5.7%
2  G1    T1 out2 86 192 0.44791667   45%
3  G1    T1 out3 67 192 0.34895833   35%
4  G1    T1 out4 28 192 0.14583333   15%
5  G1    T2 out1 61 160 0.38125000   38%
6  G1    T2 out2  1 160 0.00625000 0.62%

以下是我获取图表的方法:

ggplot(x0, aes(grp, weight=n)) +
         geom_bar(aes(fill = out), position = "fill") +
         facet_grid(.~treat) +
         scale_y_continuous(labels=percent) +
         geom_text(aes(label=p2, y=p))

我可以向数据框添加一个新变量,其中包括累积百分比,但我想知道是否有更简单的方法来添加标签。


1
这个 问题/回答 展示了我经常看到的解决方案。通过在 geom_text 中使用 position = "stack" 或者为 y 轴上的位置创建一个新变量来实现。 - aosmith
@aosmith 谢谢。加上 position = "stack" 也是一样的。我看了其他关于这个问题的SO条目(例如你的链接)。主要区别在于我在 geom_bar() 中使用了选项 position = "fill" - giordano
你是否在 geom_text 中添加了 position = "stack"(而不是 geom_bar)? 如果我将该选项添加到您的代码中,它可以正常工作。 你可能会发现你需要对非常小的百分比做一些处理。 像 label = ifelse(p < .05, NA, p2) 这样的东西可能就足够了。 - aosmith
我把它错误地放在了geom_text的aes()函数中,现在它可以工作了。非常感谢。如果您将答案写入答案区域,我可以对其进行投票。 - giordano
有趣的是:只有在 out 升序排序时才会给出正确的解决方案。 - giordano
1
这听起来是正确的,因为我相信在最新版本的ggplot2中 position = "stack" 取决于数据集的顺序(请参见这里)。 - aosmith
1个回答

5
为了避免手动创建位置值,您可以在geom_text中使用position = "stack",例如此问题所示。正如您在评论中指出的那样,数据集必须按照fill变量排序,以正确匹配条形图堆栈的顺序。
ggplot(x0, aes(grp, weight = n)) +
    geom_bar(aes(fill = out), position = "fill") +
    facet_grid(.~treat) +
    scale_y_continuous(labels=percent) +
    geom_text(aes(label = p2, y=p), position = "stack")

enter image description here

您可能需要移除某些大小以下的标签,以消除上图中看到的重叠。类似于geom_text(aes(label = ifelse(p < .05, NA, p2), y = p), position = "stack")这样的内容将移除非常小的值的标签。


注:本文涉及IT技术相关内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接