Я пытаюсь нарисовать гистограммы для данных с двумя группирующими переменными, каждая из которых имеет два уровня, используя ggplot2. Я хочу установить одну из переменных группировки на fill (и group), а другую на facet .
. И я хочу, чтобы на оси y отображался процент относительно каждой заливки как хорошо, как каждый аспект.
Моей первой идеей было обобщить данные и использовать geom_bar
, например:
df <- tibble(
x=round(rnorm(1:1000)*5, 0),
fill=rep(c("a", "b"), 500),
facet=c(rep("x", 500), rep("y", 500))
)
df %>% group_by(fill, facet, x) %>% summarize(n=n()) %>% mutate(n=n/sum(n)) %>%
ggplot(aes(x=x, y=n, group=fill, fill=fill)) +
geom_bar(stat="identity", position="dodge2") +
facet_wrap(~ facet)
, который создал этот график.
Однако, поскольку в этом случае изменение размера корзины проблематично, я бы хотел использовать geom_histogram
.
Тогда я нашел этот вопрос: Как построить граненую гистограмму (не гистограммы) с процентами относительно каждого фасета?
и придумал следующий код:
df %>%
ggplot(aes(
x=x,
y=stat(count/tapply(count, list(fill, PANEL), sum)[fill, PANEL]),
group=fill,
fill=fill)) +
geom_histogram(binwidth=1, position="dodge2") + facet_wrap(~ facet)
Но я получил ошибку: Error in unit(x, default.units) : 'x' and 'units' must have length > 0
.
Есть ли какие-нибудь хорошие способы решить проблему?
Заранее спасибо за помощь!