Проблема в том, что ggplot не знает, что каждый аспект - это одна группа. Этот очень полезный урок помогает найти отличное решение. Просто добавьте aes(group = 1)
PS. Вначале я часто очень неохотно и боялся манипулировать своими данными и предварительно рассчитывать фреймы данных для построения графиков. Но нет необходимости беспокоиться! На самом деле зачастую гораздо проще (и безопаснее!) Сначала сформировать / объединить ваши данные в нужную форму, а затем построить / проанализировать новые данные.
library(tidyverse)
library(scales)
ds <- mtcars
ds$gear <- as.factor(ds$gear)
Первое решение:
ggplot(ds, aes(gear, fill = gear)) +
geom_bar() +
facet_grid(cols = vars(cyl), margins = T) +
geom_text(aes(label = scales::percent(..prop..), group = 1), stat= "count")
изменить , чтобы ответить на комментарий
Отображение процентов по фасетам довольно запутанно для читателя рисунка, и я, вероятно, рекомендовал бы против такой визуализации , Вы не будете обходить манипулирование данными здесь. Задача состоит в том, чтобы включить ваш «грани граней». Я создаю два фрейма сводных данных и связываю их вместе.
ds_count <-
ds %>%
count(cyl, gear) %>%
group_by(gear) %>%
mutate(perc = n/sum(n)) %>%
ungroup %>%
mutate(cyl = as.character(cyl))
ds_all <-
ds %>%
count(cyl, gear) %>%
group_by(gear) %>%
summarise(n = sum(n)) %>%
mutate(cyl = 'all', perc = 1)
ds_new <- bind_rows(ds_count, ds_all)
ggplot(ds_new, aes(gear, fill = gear)) +
geom_col(aes(gear, n, fill = gear)) +
facet_grid(cols = vars(cyl)) +
geom_text(aes(label = scales::percent(perc)), stat= "count")
IMO, лучшим способом было бы просто поменять местами переменные x и facetting. Затем вы можете использовать функцию суммирования ggplots, как указано выше.
ggplot(ds, aes(as.character(cyl), fill = gear)) +
geom_bar() +
facet_grid(cols = vars(gear), margins = T) +
geom_text(aes(label = scales::percent(..prop..), group = 1), stat= "count")
Создано в 2020-02-07 пакетом prex (v0 .3.0)