Создание комбинированного гистограммы из нескольких переменных с помощью ggplot - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь создать частотную (в % terms) гистограмму, используя следующие данные:

>fulldata
Type Category
Sal         0
Sal         0
Sal         1
Sal         0
Sal         1
Sal         1
Self        1
Self        0
Self        1
Self        0
Self        0

Итак, я пытаюсь создать гистограмму (используя ggplot), которая отображает оба % от Sal и Self в полных данных и% от Sal и Self в Category==1 рядом (с метками значений%). Я попытался создать отдельный фрейм данных, отфильтровывая Category==1 из полных данных, но они перекрывают друг друга. Я попробовал следующее:

> Category1 = fulldata[which(fulldata$Category==1),]

ggplot(fulldata, aes(x=Type,y = (..count..)/sum(..count..)))+
    geom_bar()+
    geom_label(stat = "count", aes(label=round(..count../sum(..count..),3)*100), 
               vjust=1.2,size=3, format_string='{:.1f}%')+
    scale_y_continuous(labels = scales::percent)+
    labs(x = "Type", y="Percentage")+
    geom_bar(data = Category1, position = "dodge", color = "red")

* Исходные данные имеют около 80000 строк.

1 Ответ

1 голос
/ 24 апреля 2020

Одно из возможных решений - начать с вычисления всех пропорций из ggplot2.

Здесь приведен поддельный пример:

df <- data.frame(Type = sample(c("Sal","Self"),100, replace = TRUE),
                 Category = sample(c(0,1),100, replace = TRUE))

Мы можем вычислить каждую пропорцию следующим образом, чтобы получить окончательный фрейм данных:

library(tidyr)
library(dplyr)

df %>% group_by(Category, Type) %>% count() %>% 
  pivot_wider(names_from = Category, values_from = n) %>%
  mutate(Total = `0`+ `1`) %>%
  pivot_longer(-Type, names_to = "Category", values_to = "n") %>%
  group_by(Category) %>%
  mutate(Percent = n / sum(n))

# A tibble: 6 x 4
# Groups:   Category [3]
  Type  Category     n Percent
  <fct> <chr>    <int>   <dbl>
1 Sal   0           27   0.458
2 Sal   1           22   0.537
3 Sal   Total       49   0.49 
4 Self  0           32   0.542
5 Self  1           19   0.463
6 Self  Total       51   0.51 

Затем, если у вас была последовательность ggplot2, вы можете получить раф в одной последовательности:

df %>% group_by(Category, Type) %>% count() %>% 
  pivot_wider(names_from = Category, values_from = n) %>%
  mutate(Total = `0`+ `1`) %>%
  pivot_longer(-Type, names_to = "Category", values_to = "n") %>%
  group_by(Category) %>%
  mutate(Percent = n / sum(n)) %>%
  ggplot(aes(x = reorder(Category, desc(Category)), y = Percent, fill = Type))+
  geom_col()+
  geom_text(aes(label = scales::percent(Percent)), position = position_stack(0.5))+
  scale_y_continuous(labels = scales::percent)+
  labs(y = "Percentage", x = "Category")

enter image description here

Это отвечает на ваш вопрос?

...