Вертикальная линия между ячейками на гистограмме в ggplot - PullRequest
1 голос
/ 26 апреля 2020

Я хотел бы иметь возможность добавить вертикальную линию точно в 28,5, между барами 26,5 и 30,5. Это график, который я имею до сих пор. Как я могу добавить строку к этому?

enter image description here

Данные, необходимые для генерации, представляют собой один вектор со значениями от 0 до 76,5. Затем он разбивается на корзины, как показано ниже. Цель этой гистограммы - показать количество элементов в каждой корзине.

Это код, который я сейчас использую. Последняя строка кода - моя попытка добавить вертикальную линию, но она не работает. Чтобы построить это, я использовал инструкцию здесь .

breaks <- c(0, 0.5, 4.5, 8.5, 12.5, 16.5, 20.5, 24.5, 28.5, 32.5, 36.5, 40.5, 44.5, 
        48.5, 52.5, 56.5, 60.5, 64.5, 68.5, 72.5, 76.5)
tags <- c(0, 2.5, 6.5, 10.5, 14.5, 18.5, 22.5, 26.5, 30.5, 34.5, 38.5, 42.5, 46.5, 
      50.5, 54.5, 58.5, 62.5, 66.5, 70.5, 74.5)
group_tags <- cut(X2miledata_2020$hrs_82, breaks = breaks, include.lowest = TRUE, 
right = FALSE, labels = tags)
summary(group_tags)

ggplot(data = as_tibble(group_tags), mapping = aes(x = value)) + 
  geom_bar(fill = "bisque", color = "white", alpha = 0.7) +
  stat_count(geom="text", 
aes(label=sprintf("%.2f",..count../length(group_tags))), vjust=0) +
  labs(x='HRS scores') +
  theme_minimal() + 
  geom_vline(xintercept = 28.5)

1 Ответ

2 голосов
/ 26 апреля 2020

В вашем наборе данных значение 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() 

enter image description here

Делает это ответит на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...