Добавить общее количество и проценты поверх гистограммы в ggplot2

#r #ggplot2

Вопрос:

Я создал следующий график с помощью этого кода

   geom_bar(colour="black",fill="darkgrey")   theme_apa()   theme(
  plot.title = element_blank(),
  axis.title.x = element_blank(),
  axis.title.y = element_blank()) 
geom_text(stat='count', aes(label=..count..), vjust=-0.5)  
  scale_y_continuous(limits = c(0,25))
 

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

  1. Прежде всего, как мне заставить scale_y_continuous(limits = c(0,25)) автоматически распознавать максимальное количество на графике и расширить ось y на 3? В этом случае я сам установил для него значение 25, но есть ли способ заставить его делать это автоматически (например, 22 из первого ответа 3)?
  2. В верхней части каждого столбца у меня есть количество каждого ответа. Есть ли способ заставить его показывать количество, а в скобках — процент от этого количества по сравнению с общим количеством? Например, процент 22 из 51 ответа в целом будет выглядеть как 22 (43%).

Ответ №1:

Чтобы ответить на ваш вопрос по пунктам.

  1. limits Аргумент шкалы может принимать функцию (или, в последних версиях, формулу синтаксиса лямбда), которая принимает естественные пределы в виде вектора длины 2 в качестве входных данных. Вы можете написать свою собственную формулу, если хотите увеличить максимум на 3.
  2. Вы можете использовать after_stat() функцию для доступа к вычисляемым переменным, чтобы вы могли форматировать count вычисляемую переменную по своему вкусу.
 library(ggplot2)

df <- data.frame(
  value = sample(LETTERS[1:5], 50, replace = TRUE)
)

ggplot(df, aes(value))  
  geom_bar()  
  geom_text(
    stat = "count", vjust = -1,
    aes(label = after_stat(
      paste0(count, " (", count * 100 / sum(count), "%)")
    ))
  )  
  scale_y_continuous(
    limits = ~ c(0, .x[2]   3)
  )
 

Создано 2021-11-01 пакетом reprex (версия 0.3.0)

Комментарии:

1. Большое вам спасибо, это работает отлично. Я все еще не могу понять, как работают ограничения по оси y, но я изучу это дальше. Кроме того, я округлил%, так как в нем было много цифр следующим образом paste0(count, " (", round(count * 100 / sum(count),0), "%)")