#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()