如何在ggplot2中使用position_fill将文本对齐到条形图?

时间:2019-03-15 18:42:46

标签: r ggplot2

我以为我知道使文本与情节对齐,但这使我感到困惑。我想使用position_fill()来显示组的百分比份额,但是要在geom_text中包括组计数,以指示不同的组具有不同的观察值。因为某些组的份额很小,所以我决定只在图的两端固定标签。

这是我的第一次尝试,使用来自long_sepal的示例组变量iris,即Sepal.Length是否大于5.5。

我制作了一个自定义y_label变量,该变量可以是0或1以映射到y的{​​{1}}美观,以便标签始终位于图的极端。 / p>

geom_text

一切顺利,但library(tidyverse) iris %>% mutate(long_sepal = Sepal.Length > 5.5) %>% count(Species, long_sepal) %>% mutate(y_label = if_else(long_sepal, 0, 1)) %>% ggplot(aes(x = Species)) + geom_col(aes(y = n, fill = long_sepal), position = position_fill()) + geom_text( mapping = aes(label = n, y = y_label, group = long_sepal), hjust = 0, position = position_fill() ) + coord_flip() 标签悬在情节边缘。没问题,我只更改FALSE的值:

y_label

什么都没有改变。有趣的是,似乎可以更改iris %>% mutate(long_sepal = Sepal.Length > 5.5) %>% count(Species, long_sepal) %>% mutate(y_label = if_else(long_sepal, 0, 0.5)) %>% # This has changed ggplot(aes(x = Species)) + geom_col(aes(y = n, fill = long_sepal), position = position_fill()) + geom_text( mapping = aes(label = n, y = y_label, group = long_sepal), hjust = 0, position = position_fill() ) + coord_flip() 中的第一个值,但不能更改第二个值,如下所示。左侧标签将移动,但似乎不像我期望的那样与0.25对齐。有什么想法吗?我关于地质工作原理的思维模式在这里破裂了吗?我怀疑这与if_else有关,但我不确定。

position_fill

reprex package(v0.2.1)于2019-03-15创建

1 个答案:

答案 0 :(得分:2)

使用注释,尤其是来自Axeman的注释,我意识到我可以使用position_identity()获得所需的结果:

library(tidyverse)
iris %>%
  mutate(long_sepal = Sepal.Length > 5.5) %>%
  count(Species, long_sepal) %>%
  ungroup() %>%
  mutate(y_label = if_else(long_sepal, 0.01, 0.99)) %>%
  ggplot(aes(x = Species)) +
  geom_col(aes(y = n, fill = long_sepal), position = position_fill()) +
  geom_text(
    mapping = aes(label = n, y = y_label, group = long_sepal),
    hjust = "inward",
    position = position_identity()
  ) +
  coord_flip()

reprex package(v0.2.1)于2019-03-15创建