Построение гистограмм с использованием трех категориальных переменных в R

#r #ggplot2

#r #ggplot2

Вопрос:

Мой фрейм данных похож на этот

 df<-read.table (text=" Gender   Fruit   Food
Male    Pear    Yes
Female  Pear    Yes
Male    Grape   Yes
Female  Apple   No
Male    Grape   No
Male    Pear    No
Male    Guba    Yes
Male    Grape   No
Female  Apple   No
Female  Pear    Yes
Female  Apple   Yes
Male    Guba    No
Female  Guba    No
Male    Pear    Yes
Male    Apple   Yes
Male    Pear    No
Female  Pear    Yes
Male    Guba    No

", header=TRUE)
 

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

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

В сюжете G, A, G, P следует читать Виноград, Яблоко, Губа и Груша

Было бы хорошо, если бы у нас была таблица под этим графиком, чтобы увидеть значения. Это было сделано в Excel просто.

Ответ №1:

При ggplot этом вам необходимо сопоставить каждую из интересующих вас переменных с эстетикой или аспектом. Так что что-то подобное может сработать:

 ggplot(df)  
  geom_bar(aes(x=Fruit, fill=Food),
           position = "dodge")  
  facet_wrap(~Gender)
 

гистограмма с подсчетами по 3 переменным

Чтобы добавить таблицу, вы можете просто вычислить ее отдельно, а затем преобразовать в элемент графика.

 p_grph <- ggplot(df)  
  geom_bar(aes(x=Fruit, fill=Food),
           position = "dodge")  
  facet_wrap(~Gender)

p_table <- df %>%
  group_by(Gender, Fruit, Food) %>%
  summarize(count=n()) %>%
  gridExtra::tableGrob()

gridExtra::grid.arrange(p_grph, p_table)
 

график сверху и таблица ниже

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

1. Как показано на иллюстрации Duck, вы можете сгенерировать таблицу отдельно с group_by помощью и summarize и присоединить ее к графику с patchwork помощью (или включить их оба в документ Rmarkdown). Я редактирую свой ответ с gridExtra иллюстрацией.

Ответ №2:

Вы также можете попробовать:

 library(ggplot2)
library(dplyr)
#Code
df %>% group_by_all() %>% summarise(N=n()) %>%
  ggplot(aes(x=Fruit,y=N,fill=Fruit)) 
  geom_bar(stat = 'identity',
           position = position_dodge2(0.9,preserve = 'single')) 
  facet_wrap(Gender~Food,scales = 'free',nrow = 1) 
  theme(legend.position = 'top')
 

Вывод:

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

Если вы хотите добавить таблицу, вы можете использовать patchwork :

 library(patchwork)
#Data for table
Tab <- df %>% group_by_all() %>% summarise(N=n()) 
#Code
G1 <- df %>% group_by_all() %>% summarise(N=n()) %>%
  ggplot(aes(x=Fruit,y=N,fill=Fruit)) 
  geom_bar(stat = 'identity',
           position = position_dodge2(0.9,preserve = 'single')) 
  facet_wrap(Gender~Food,scales = 'free',nrow = 1) 
  theme(legend.position = 'top')
#Compose
G1 gridExtra::tableGrob(Tab)
 

Вывод:

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

Если вам нужна приведенная ниже таблица, вы можете изменить с помощью / .

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

1. @user330 Да, я добавлю сейчас!

2. @user330 Я добавил обновление, надеясь, что это поможет!

3. Спасибо — извините, но когда я запускаю ваши коды на большом объеме выборки, гистограмма выглядит одинаково. и предоставленная таблица не помогает, поскольку нет никаких доказательств частотного распределения переменных. Я могу легко получить, используя SPSS и Excel.

4. @user330 Да, с большими данными вы должны быть осторожны с тем, как упорядочивать данные, здесь выборка небольшая.