I would like to create a plot with subgroups in legend using interaction. I create some fake data with zero values to create subheading.
My sample data:
library(ggplot2)
df <- data.frame(value = runif(27, 0, 1),
x = rep(1:3, each = 3),
group1 = rep(c(letters[1:3])),
group2 = rep(c("fake", "X", "Y"), each = 9))
# introducing fake data
df[df$group2 == "fake", "value"] <- 0
df$group2 <- relevel(df$group2, ref = "fake")
I was almost able to create desired plot:
# labels
lbl1 <- c(expression(bold("HEADING 1")), paste("LABEL 1", 1:2),
expression(bold("HEADING 2")), paste("LABEL 2", 1:2),
expression(bold("HEADING 3")), paste("LABEL 3", 1:2))
fills <- c("white", "red1", "red3",
"white", "blue1", "blue3",
"white", "green1", "green3")
colo <- c("white", "black", "black",
"white", "black", "black",
"white", "black", "black")
ggplot(df, aes(x = x, y = value,
fill = interaction(group2, group1),
colour = interaction(group2, group1))) +
geom_col(position = "dodge") +
scale_fill_manual("", values = fills, label = lbl1) +
scale_colour_manual("", values = colo, label = lbl1)
However, I don't want to have LABEL 1 1 and LABEL 1 2 etc in subgroups, I would like to have only LABEL 1 and LABEL 2.
I was not able to create such a plot when specifying such labels:
lbl2 <- c(expression(bold("HEADING 1")), paste("LABEL", 1:2),
expression(bold("HEADING 2")), paste("LABEL", 1:2),
expression(bold("HEADING 3")), paste("LABEL", 1:2))
ggplot(df, aes(x = x, y = value,
fill = interaction(group2, group1),
colour = interaction(group2, group1))) +
geom_col(position = "dodge") +
scale_fill_manual("", values = fills, label = lbl2) +
scale_colour_manual("", values = colo, label = lbl2)
To be explicit, this is desired output:




