#r #ggplot2 #bar-chart #facet
Вопрос:
Я пытаюсь построить гистограмму в R, используя ggplot. Предполагается, что график представляет проценты разной длины, и каждая грань представляет категориальную переменную. Есть третья переменная, с помощью которой я хочу раскрасить полосы. Вот имитация того, что я делаю:
lengths lt;- sample(x = c(12, 15, 20, 25, 30, 32, 35, 40, 45, 60), size = 1000, replace = TRUE) group lt;- sample(c("A", "B", "C", "D"), size = 1000, replace = TRUE) sex lt;- sample(c("Female", "Male"), size = 1000, replace = TRUE) data lt;- data.frame(lengths = lengths, sex = sex, group = group) rm(lengths, group, sex) ggplot(data = data %gt;% bind_rows(data %gt;% mutate(group = "Total")), aes(x = lengths, group = group, fill = sex)) geom_bar(aes(y = ..prop..), color = "black", stat = "count") labs(y = "%", fill = "sex") facet_wrap(~ group, nrow = 6, strip.position = "right", scales = "free") scale_x_continuous(limits = c(20,80)) scale_y_continuous(labels = scales::percent) theme(legend.position = c(.75, .95), legend.background = element_rect(fill = "white", color = "black"), axis.line = element_line(color = "black"), panel.background = element_blank(), legend.direction = "horizontal", strip.background = element_blank(), strip.text.y = element_blank()) scale_color_discrete(guide = "none") scale_fill_manual(values = c("purple", "blue", "gray"))
Но результат-это не то, что я ищу, так как все полоски окрашены в серый цвет, а не заполнены сексом:
Это код, который я использовал для расчета пропорции в отношении количества в каждой группе (не пола). Если я не учитываю групповой аргумент, шкалы кажутся неправильными.
Поэтому, по сути, я все еще хочу показать пропорцию по отношению к каждой отдельной группе, но заполнить столбцы другой категориальной переменной.
Есть идеи, как это решить?
Спасибо
Ответ №1:
Просто удалите группу=группа:
`ggplot(data = data %gt;% bind_rows(data %gt;% mutate(group = "Total")), aes(x = lengths, fill = sex)) geom_bar(aes(y = ..prop..), color = "black", stat = "count") labs(y = "%", fill = "sex") facet_wrap(~ group, nrow = 6, strip.position = "right", scales = "free") scale_x_continuous(limits = c(20,80)) scale_y_continuous(labels = scales::percent) theme(legend.position = c(.75, .95), legend.background = element_rect(fill = "white", color = "black"), axis.line = element_line(color = "black"), panel.background = element_blank(), legend.direction = "horizontal", strip.background = element_blank(), strip.text.y = element_blank()) scale_color_discrete(guide = "none") scale_fill_manual(values = c("purple", "blue", "gray"))`
Мне потребовалось довольно много времени, чтобы понять это.
Комментарии:
1. Нет, при этом проценты не рассчитываются в привязке к группе. Если вы примените это изменение к примеру, вы увидите, как ось y изменится на другой процент.
2. Я не думаю, что удаление » scales = ‘free’ » из вызова facet_wrap допустимо?
3. Это не решает проблему
4. К сожалению, это за пределами моих знаний, но я думаю, что ответ должен включать преобразование данных перед вызовом ggplot, поскольку кажется очевидным, что group и fill несовместимы, поскольку вы их настроили.