Вы можете сделать это с небольшим изменением формы заранее.Вам нужно немного логики, чтобы связать красные полосы (group1a
) с зелеными полосами (group1b
), и то же самое для синих и фиолетовых полос.В этом случае общностью является номер группы.Самый простой способ создать переменную с номером группы, по крайней мере, с данными, которые у вас есть, это просто подгруппировать группу для всех, кроме последнего символа.Если группы становятся более сложными, вы можете вместо этого использовать регулярное выражение.
Затем, когда position = "identity"
находится внутри geom_col
, вы размещаете бары независимо от того, будут ли они перекрывать друг друга.
library(tidyverse)
data_split <- data_ggp %>%
mutate(group_num = str_sub(group, 1, -2))
head(data_split)
#> category values group group_num
#> 1 cat1 0.664 group1a group1
#> 2 cat2 0.045 group1a group1
#> 3 cat3 0.291 group1a group1
#> 4 cat1 0.482 group1b group1
#> 5 cat2 0.029 group1b group1
#> 6 cat3 0.489 group1b group1
Теперь вы можете использовать group_num
для размещения баров на оси X.Одним из способов является использование взаимодействия между этими группами и категориями:
ggplot(data_split, aes(x = interaction(group_num, category), y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4)
Другой способ заключается в размещении только номера группы на оси X, затем фасет по категории,Вы можете настроить элементы темы так, чтобы фасеты выглядели не так, как фасеты, а больше как большие группы по оси x, но я оставлю это советам из других вопросов SO.
ggplot(data_split, aes(x = group_num, y = values, fill = group)) +
geom_col(position = "identity", alpha = 0.4) +
facet_wrap(~ category)
Обратите внимание, что geom_col
эквивалентно geom_bar(stat = "identity")
, и что я перевернул альфа-путь вниз, чтобы показать перекрытия.
Создано в 2018-11-26 при представлении пакета (v0.2.1)