Гистограмма групп на основе подсчетов

#r #ggplot2 #bar-chart

#r #ggplot2 #гистограмма

Вопрос:

Я пытаюсь сделать гистограмму

Данные находятся в dataframe. В этих фреймах данных у меня есть несколько столбцов, один с именем ID и другой count.

Сначала я пытаюсь сгруппировать это количество. На гистограмме мы должны видеть: count = 0, count = 1, count = 2, count> = 3

Некоторые примеры данных

 data1 <- data.frame(ID="ID_1", count=(rep(seq(0,10,by=1),each=4)))
data2 <- data.frame(ID="ID_2", count=(rep(seq(0,10,by=1),each=4)))
data3 <- data.frame(ID="ID_3", count=(rep(seq(0,10,by=1),each=4)))
  

Очевидно, что здесь гистограммы фреймов данных будут выглядеть одинаково

Я пытался сделать это в ggplot (это совсем не приятно)

 ggplot(data1) 
geom_bar(aes(x = ID, fill = count),position = "fill") 
geom_bar(data=data2,aes(x = ID, fill = count),position = "fill") 
geom_bar(data=data3,aes(x = ID, fill = count),position = "fill")
  

Я получил что-то вроде этого
Что
То, что я пытаюсь сделать, это иметь разные группы внутри гистограммы, например, долю отсчетов 0, долю отсчетов 1,2 и долю отсчетов, большую (и равную) 3.

Я ожидаю чего-то подобного

Что нужно

Но, конечно, в моем примере гистограммы будут выглядеть одинаково. Также, если у вас есть какие-либо предложения по изменению оси Y с 1.00 до 100%.

Также одна из моих проблем заключается в том, что длина моих реальных фреймов данных не равна, но это не должно иметь значения, потому что я пытаюсь получить процент от группы подсчета

Ответ №1:

Вам нужно поместить все данные в 1 фрейм данных в длинном формате. Затем приведите свои подсчеты к факторам, и это сработает.

 ggplot(bind_rows(data1, data2, data3))  
geom_bar(aes(x = ID, fill = as.factor(count)), position = "fill")  
scale_y_continuous(labels=scales::percent)   # To get the Y axis in percentage
  

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

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

1. Чтобы получить процент в y, добавьте ` scale_y_continuous (labels = scales::percentage)` в результирующий график.

2. Спасибо, на самом деле это работает с примерами данных. Но я только что заметил, что у меня проблема с моими реальными данными. Длина фреймов данных не равна. Есть идеи, как с этим справиться?

3. @Nono_sad Имеют ли df одинаковые столбцы ? Им не обязательно иметь одинаковое количество строк .

4. @RuiBarradas Да, у них одинаковые столбцы

5. @Nono_sad Затем попробуйте код в ответе, похоже, он не зависит от df с равным количеством строк.

Ответ №2:

Итак, я сделал кое-что, чтобы попытаться создать свою гистограмму

 data1$var="first"
data2$var="second"
data3$var="third"
data4$var="fourth"
data5$var="fifth"

full_data=rbind(data1,data2,data3,data4,data5)

ggplot(ppgk)  
geom_bar(aes(x = var, fill = as.factor(Count)), position = "fill") 
scale_y_continuous(labels=scales::percent)
  

Итак, я получил что-то вроде этого :
введите описание изображения здесь

Если у кого-то есть решение для создания другой группы подсчетов: count = 0, count = 1, count = 2, count> = 3

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

1. Это другой вопрос. Вы должны открыть новое сообщение, чтобы задать свой вопрос, и принять ответ на этот пост, если он решил ваш первый вопрос.

2. При этом ответ заключается в создании нового столбца count_grouped , где count_grouped = count if count < 3 и count_grouped = 3 if count >= 3 . Затем вы можете использовать count_grouped в качестве эстетики вместо count .