I have the following chart
year <- 2022:2026
data <- 15:11
data2 <- 10:6
data3 <- 1:5
dat <- tibble(year, data, data2, data3)
data <- dat %>% group_by(year) %>% pivot_longer(all_of(starts_with('data'))) %>% ungroup() %>%
mutate(first_categ = case_when('data2'==name | 'data3'==name ~ value,
TRUE ~ 0L))
ggplot(data, aes(x = year, fill = name))
geom_bar(aes(y = value), stat = 'identity', position = 'stack')
geom_col(aes(y=first_categ), alpha = 0, color = 'black', size = 2)
I'd like to have a separation between the two first colors (data2
and data3
) and the rest because for me, these colors belong to the same category.
Is it possible to remove the intermediate horizontal separation between the blue and green?
CodePudding user response:
This is trickier than you'd imagine. Effectively you need to map to different aesthetics and fake the guides to get this effect:
ggplot(data, aes(x = year))
geom_col(aes(y = value, color = "data"), fill = "#F8766D",
position = 'stack')
geom_col(aes(y = value, fill = name), position = "stack",
data = subset(data, name != "data"))
stat_summary(fun = sum, aes(y = first_categ), color = 'black',
alpha = 0, size = 2, geom = "bar")
labs(color = "name")
scale_fill_manual(values = scales::hue_pal()(3)[-1], name = NULL)
guides(fill = guide_legend(override.aes = list(color = "black", size = 1.5),
byrow = TRUE),
color = guide_legend(order = 1))
theme(legend.margin = margin(20, 0, 20, 0),
legend.key.size = unit(10, "mm"),
legend.spacing.y = unit(-1.5, "mm"),
legend.box.background = element_blank(),
legend.background = element_blank(),
legend.title = element_text(margin = margin(0, 0, 20, 0)))