Как мне подсчитать и отобразить различные комбинации переменных в ggplot2?

#r #ggplot2 #data-visualization #tidyverse

#r #ggplot2 #визуализация данных #tidyverse

Вопрос:

Я пытаюсь визуализировать информацию в переменных следующего набора данных:

 BinVar-1 BinVar-2 MultiVar-1 MultiVar-2 Region
  0          0       0         0          Africa
  0          1       1         0          Europe
  0          1       2         0          Asia
  1          0       0         1          Asia
  1          0       3         2          Europe
  1          1       4         3          Africa
  0          0       5         4          Africa
  1          1       5         4          Asia
  0          0       3         2          Asia
  0          0       3         2          Europe
  

Я хотел бы визуализировать эту информацию с помощью гистограмм. Вот конкретные гистограммы, которые я пытаюсь визуализировать:

  • Количество единиц в BinVar-1 в зависимости от региона
  • Количество единиц в BinVar-2 в зависимости от региона
  • Количество уникальных значений в MultiVar-1 в зависимости от региона
  • Количество уникальных значений в MultiVar-2 в зависимости от региона
  • Количество строк в регионе

Как мне это сделать в tidyverse and ggplot2 ?

Ответ №1:

Вот решение для одновременного отображения всех трех столбчатых графиков.
Сначала сгруппируйте Region , затем summarise данные в соответствии со спецификациями вопроса и измените формат с широкого на длинный. Наконец, создайте вспомогательную переменную type , удалив числа из и т.д. BinVar-1 Графики теперь просты.

 library(tidyverse)

df1 %>%
  group_by(Region) %>%
  summarise(
    `BinVar-1` = sum(`BinVar-1`, na.rm = TRUE),
    `BinVar-2` = sum(`BinVar-2`, na.rm = TRUE),
    `MultiVar-1` = n_distinct(`MultiVar-1`, na.rm = TRUE),
    `MultiVar-2` = n_distinct(`MultiVar-2`, na.rm = TRUE),
    Count = n(),
    .groups = "drop"
  ) %>%
  pivot_longer(cols = -Region) %>%
  mutate(type = sub("-\d", "", name),
         type = factor(type, levels = c("BinVar", "MultiVar", "Count"))) %>%
  ggplot(aes(Region, value, fill = Region, group = name))  
  geom_col(position = position_dodge())  
  facet_wrap(~ type)
  

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

Для построения графиков по одному за раз, после и непосредственно перед фильтрованием по и передачей в . mutate ggplot type ggplot Например,

 filter(type == "BinVar") %>%
  

Данные

 df1 <- read.table(text = "
BinVar-1 BinVar-2 MultiVar-1 MultiVar-2 Region
  0          0       0         0          Africa
  0          1       1         0          Europe
  0          1       2         0          Asia
  1          0       0         1          Asia
  1          0       3         2          Europe
  1          1       4         3          Africa
  0          0       5         4          Africa
  1          1       5         4          Asia
  0          0       3         2          Asia
  0          0       3         2          Europe
", header = TRUE, check.names = FALSE)
  

Ответ №2:

 df <- tribble(
  ~BinVar1, ~BinVar2, ~MultiVar1, ~MultiVar2, ~Region,
  0, 0, 0, 0, "Africa",
  0, 1, 1, 0, "Europe",
  0, 1, 2, 0, "Asia",
  1, 0, 0, 1, "Asia",
  1, 0,3,  2, "Europe",
  1, 1, 4, 3, "Africa",
  0, 0, 5, 4, "Africa",
  1, 1, 5, 4, "Asia",
  0, 0, 3, 2, "Asia",
  0, 0, 3, 2, "Europe"
)
  

Во-первых, мы можем использовать group_by() , filter() , distinct() , и summarise() из пакета dplyr.

  • Количество единиц
 # BinVar-1
df %>%
  group_by(Region) %>%
  filter(BinVar1 == 1) %>%
  summarise(n = n())

# BinVar-2
df %>%
  group_by(Region) %>%
  filter(BinVar2 == 1) %>%
  summarise(n = n())
  
  • Количество уникальных значений
 # MultiVar-1
df %>%
  group_by(Region) %>%
  distinct(MultiVar1) %>%
  summarise(n = n())

# MultiVar-2
df %>%
  group_by(Region) %>%
  distinct(MultiVar2) %>%
  summarise(n = n())
  
  • Количество строк
 df %>%
  group_by(Region) %>%
  summarise(n = n())
  

Тогда просто используйте ggplot() . Здесь в качестве примера я показываю количество единиц в BinVar-1 в зависимости от региона.

 df %>%
  group_by(Region) %>%
  filter(BinVar1 == 1) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = Region, y = n))  
  geom_col()