В вашем наборе данных значение 28,5 не находится между 26,5 и 30,5, потому что если вы посмотрите на свою функцию cut
при прохождении include.lowest = TRUE
, у вас будет значение 28,5, подсчитываемое как часть группы "30,5" ,
Вот пример:
df <- data.frame(x = rnorm(100, mean = 38.5, sd = 10))
library(dplyr)
df %>% add_row(x = 28.5) %>%
mutate(group_tags = cut(x, breaks = breaks, include.lowest = TRUE,
right = FALSE, labels = tags)) %>%
filter(x == 28.5)
x group_tags
1 28.5 30.5
Итак, у вас есть два варианта в зависимости от того, хотите ли вы нарисовать линию с точным значением 28,5 (так, группа «30,5») или между 26,5 и 30,5.
Для первого варианта вам просто нужно создать второй набор данных с этим конкретным значением, как указано выше, и использовать geom_segment
, чтобы нарисовать линию в местоположении соответствующего group_tags
для значение 28,5. В приведенном ниже коде я рисую эту опцию в виде «красной» линии.
Для второй вы можете вручную посчитать количество баров для 26,5 и 30,5 и установить geom_vline
в качестве этого значения. Для каждого бара вы учитываете одну единицу, начиная слева. В моем примере у меня 13 различных баров, 26,5 - это 4-й, а 30,5 - 5-й, поэтому я ставлю geom_vline
на 4,5 (синяя линия). В вашем примере geom_vline(xintercept = 8.5)
должен работать.
Вот код для генерации приведенного ниже графика:
library(dplyr)
DF <- df %>% mutate(group_tags = cut(x, breaks = breaks, include.lowest = TRUE,
right = FALSE, labels = tags))
gv <- df %>% add_row(x = 28.5) %>%
mutate(group_tags = cut(x, breaks = breaks, include.lowest = TRUE,
right = FALSE, labels = tags)) %>%
filter(x == 28.5)
library(ggplot2)
ggplot(DF, aes(x = as.character(group_tags)))+
geom_bar(fill = "bisque", color = "white", alpha = 0.7)+
geom_segment(data = gv,
aes(x = group_tags, xend = group_tags,
y = -Inf, yend = Inf,group = 1),color = "red" )+
geom_vline(xintercept = 4.5, color = "blue")+
stat_count(geom="text",
aes(label=sprintf("%.2f",..count../length(DF$group_tags))),
vjust=0) +
labs(x='HRS scores') +
theme_minimal()
Делает это ответит на ваш вопрос?