使用 R 中的 ggplot2 在分面、躲避条形图上的每个条形上居中对齐文本

LC-*_*ist 3 r text-alignment ggplot2 centering geom-text

我希望我的文本在多面躲避条形图中的每个条形上方居中对齐。

# setup
library(ggplot2); library(tidyverse)
data("iris")

# graph
iris %>% group_by(Species) %>% 
mutate(Petal_Group = ifelse(Petal.Width < median(Petal.Width), "Short", "Long")) %>% 
mutate(Sepal_Group = ifelse(Sepal.Width < median(Sepal.Width), "Short", "Long")) %>% 
group_by(Petal_Group, Sepal_Group, Species) %>% 
summarise(mean.Sepal.Length = mean(Sepal.Length)) %>% 
mutate(asterisks = "***") %>% 
ggplot(aes(x = Petal_Group, y = mean.Sepal.Length)) + 
    geom_col(aes(fill = Species), position = "dodge") + 
    geom_text(aes(label=asterisks, group = Species), position = position_dodge(width = 1)) + 
    facet_grid(~Sepal_Group, labeller = label_parsed) + 
    theme(legend.position = "bottom", panel.background = element_blank(), panel.border = element_rect(colour = "black", fill = NA, size = 0.2), strip.background = element_blank())
Run Code Online (Sandbox Code Playgroud)

需要文本居中对齐的多面躲避条形图示例

在这个例子中(对不起,如果它过于复杂,但我正在处理这样的事情),三个星号(“***”)没有在每个条上居中。即,红色条上的星号出现在左侧,而蓝色条上的星号出现在右侧。

我尝试调整 hjust,geom_text但我无法正确调整。(难道没有更通用的中心对齐方式,比如position = "center"?)

Mar*_*ius 6

我认为geom_barand的默认闪避宽度geom_col是 0.9,而不是 1,所以你的文本被闪避的量与你的条不同。如果您创建一个可以应用于列和文本的闪避对象,它们将很好地对齐:

# graph
dodger = position_dodge(width = 0.9)
iris %>% group_by(Species) %>% 
    mutate(Petal_Group = ifelse(Petal.Width < median(Petal.Width), "Short", "Long")) %>% 
    mutate(Sepal_Group = ifelse(Sepal.Width < median(Sepal.Width), "Short", "Long")) %>% 
    group_by(Petal_Group, Sepal_Group, Species) %>% 
    summarise(mean.Sepal.Length = mean(Sepal.Length)) %>% 
    mutate(asterisks = "***") %>% 
    ggplot(aes(x = Petal_Group, y = mean.Sepal.Length)) + 
    geom_col(aes(fill = Species), position = dodger) + 
    geom_text(aes(label=asterisks, group = Species), position = dodger) + 
    facet_grid(~Sepal_Group, labeller = label_parsed) + 
    theme(legend.position = "bottom", panel.background = element_blank(), 
          panel.border = element_rect(colour = "black", fill = NA, 
          size = 0.2), strip.background = element_blank())
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明