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

问题描述 投票:1回答:1

我以为我理解将文字与情节对齐但是这个让我难过。我想使用position_fill()来显示组的百分比份额,但是包括geom_text的组计数以指示不同的组具有不同的观察数量。因为有些团体的份额非常小,所以我决定将标签固定在情节的两端。

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

我制作了一个自定义的y_label变量,该变量为0或1,以映射到ygeom_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()

没有任何改变。有趣的是,它似乎在改变if_else中的第一个值而不是第二个值,如下所示。左边的标签会移动,但似乎没有像我期望的那样与0.25对齐。有什么想法吗?我的心理模型是如何在这里打破宝石?我怀疑它与position_fill有关,但我不确定。

iris %>%
  mutate(long_sepal = Sepal.Length > 5.5) %>%
  count(Species, long_sepal) %>%
  mutate(y_label = if_else(long_sepal, 0.25, 1)) %>% # Now the text moves, but not where I expect
  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()

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

r ggplot2
1个回答
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创建于2019-03-15(v0.2.1)

© www.soinside.com 2019 - 2024. All rights reserved.