Построение гистограммы для фрейма данных с двумя столбцами работает просто отлично:
library(tidyverse)
tibble(.group = c("A","B","A","B","B","A","A","A","A") %>% factor,
.value = c( 1L, 1L, 3L, 3L, 2L, 2L, 3L, 3L, 1L)) %>%
ggplot() +
geom_bar(aes(x=.value, y=..prop.., fill=.group), position = "dodge")
Однако, когда переменная объявлена как фактор, geom_bar дает бессмысленные результаты. Что происходит в данном конкретном случае?
library(tidyverse)
tibble(.group = c("A","B","A","B","B","A","A","A","A") %>% factor,
.value = c( 1L, 1L, 3L, 3L, 2L, 2L, 3L, 3L, 1L) %>% factor) %>%
ggplot() +
geom_bar(aes(x=.value, y=..prop.., fill=.group), position = "dodge")
Когда переменная x является числовой, geom_bar
вычисляет пропорцию относительно всех значений переменной x. Когда переменная x является категориальной (символ или факторный класс), geom_bar
вычисляет пропорцию в пределах для каждого значения переменной x. Вы можете переопределить это поведение, добавив эстетику group
, чтобы заставить geom_bar
вычислять пропорцию относительно всех значений x. Например:
dat = tibble(.group = c("A","B","A","B","B","A","A","A","A") %>% factor,
.value = c( 1L, 1L, 3L, 3L, 2L, 2L, 3L, 3L, 1L))
# .value is integer
ggplot(dat) +
geom_bar(aes(x=.value, y=..prop.., fill=.group), position = "dodge")
# .value is factor
ggplot(dat %>% mutate(.value=factor(.value))) +
geom_bar(aes(x=.value, y=..prop.., fill=.group), position = "dodge")
ggplot(dat %>% mutate(.value=factor(.value))) +
geom_bar(aes(x=.value, y=..prop.., fill=.group, group=.group), position = "dodge")
# .value is character
ggplot(dat %>% mutate(.value=as.character(.value))) +
geom_bar(aes(x=.value, y=..prop.., fill=.group), position = "dodge")
ggplot(dat %>% mutate(.value=as.character(.value))) +
geom_bar(aes(x=.value, y=..prop.., fill=.group, group=.group), position = "dodge")
geom_line
ведет себя аналогичным образом, когда переменная x является категориальной. Например:
set.seed(3)
dat = data.frame(x=rep(paste0(2010:2015, "-", substr(2011:2016,3,4)), 2),
y=cumsum(rnorm(12)),
group=rep(LETTERS[1:2], each=6))
ggplot(dat, aes(x=x, y=y, colour=group)) +
geom_point() +
geom_line()
ggplot(dat, aes(x=x, y=y, colour=group, group=group)) +
geom_point() +
geom_line()
Хотя факторы выглядят как символы, на самом деле они закодированы как целые числа с соответствующим текстом. Что-то, имеющее отношение к этим отношениям, происходит здесь. Прочтите это для меня: r4ds.had.co.nz/factors.html