Выравнивание текста по центру каждой полосы на граненом, уклоненном графике с использованием ggplot2 в R

Я хотел бы, чтобы мой текст был выровнен по центру над каждой полосой на граненом графике с уклоном.

# 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())

Пример граненого гистограммы с уклонением, для которого требуется выравнивание текста по центру

В примере (извините, если это слишком сложно, но я работаю с чем-то вроде этого) тройные звездочки («***») не центрируются над каждой полосой. То есть звездочки над красными полосами отображаются слева, а звездочки над синими полосами — справа.

Я попытался отрегулировать hjust в geom_text, но у меня не получилось. (И нет ли более универсального способа выравнивания по центру, что-то вроде position = "center"?)


person LC-datascientist    schedule 13.06.2018    source источник


Ответы (1)


Ширина уклонения по умолчанию для geom_bar и 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())

Результат:

введите описание изображения здесь

person Marius    schedule 13.06.2018