I am trying to make a plot that combines bars with points (of different colors and shapes). Therefore, I need to combine fill, color and shape in the same legend. I am close to my desired result, however I cannot get the shape legend to show up correctly in combination with the others (see the blue dot for "Top 2016", which should instead be a triangle). How to achieve this? (Bonus question: I would like to not have the grey shading behind the dots in the legend).
Moreover, I would like to remove the "Middle 2021" category from showing up in the legend. How to do this too?
Minimal working example code:
library(ggplot2)
library(data.table)
dt <- structure(list(country = c("AA", "BB", "CC", "AA", "BB", "CC", "AA", "BB",
"CC", "AA", "BB", "CC", "AA", "BB", "CC", "AA",
"BB", "CC", "AA", "BB", "CC", "AA", "BB", "CC"),
variable = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L,
4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L,
7L, 7L, 7L, 8L, 8L, 8L),
levels = c("low_2021", "middle_2021",
"intermediate_2021", "advanced_2021",
"low_2016", "middle_2016",
"intermediate_2016", "advanced_2016"),
class = "factor"),
value = c(25, 17, 19, 67, 75, 70, 75, 83, 81, 8, 8, 11, 19,
13, 14, 70, 76, 75, 81, 87, 86, 11, 11, 11)),
row.names = c(NA, -24L),
class = c("data.table", "data.frame"))
ggplot(mapping = aes(x=value,
y=country
)
) +
geom_bar(data=dt[variable%in%c("low_2021",
"middle_2021",
"advanced_2021")],
aes(fill=variable),
stat="identity"
) +
geom_point(data=dt[variable%in%c("intermediate_2016",
"advanced_2016")],
aes(color=variable,
shape=variable
)
)+
labs(x=NULL,
y=NULL) +
scale_fill_manual(breaks = c("advanced_2021",
"middle_2021",
"low_2021",
"advanced_2016",
"intermediate_2016"),
labels = c("Top 2021",
"Middle 2021",
"Low 2021",
"Top 2016",
"Low 2016"),
values = c("#8ED973",
"#D9D9D9",
"#F1A983",
"blue",
"red"),
aesthetics = c("fill", "color")
) +
guides(fill=guide_legend(ncol=2),
shape="none") +
theme(legend.position = "bottom",
legend.title = element_blank())
I think its easier to split your data, geom()
and aes()
differently. The example was setting fill
and color
at the same time, with scale_fill_manual(...,aesthetics = c("fill", "color")
, making ajustements harder in my opinion
%>%
) for ggplot()
and geom_bar()
, and another filtered dataset is used for geom_point()
"Middle 2021"
, simply ommit a name/break/label in scale_color_manual()
. You might want to set the fill color of NA values na.value="#D9D9D9"
.scale_color_manual(limits = [...]
, but I'm not sure to understand the differences with breaks
, scale_fill_manual(breaks [...]
fill=guide_legend(ncol=1) , color=guide_legend(ncol=1)
legend.key = element_blank()
) in the theme()
"`filter( dt , variable %in% c("low_2021", "middle_2021", "advanced_2021")) %>%
ggplot(aes(x = value, y = country,fill = variable)) +
geom_bar( stat="identity"
)+
labs(x=NULL,
y=NULL) +
scale_fill_manual(limits = c("advanced_2021",
"low_2021"
),
labels = c("Top 2021",
"Low 2021"
),
values = c("#8ED973",
"#F1A983"
), na.value="#D9D9D9",
aesthetics = c("fill")
) +
geom_point(data =filter(dt, variable %in%c("intermediate_2016",
"advanced_2016")),
aes(col = variable, shape = variable),
size = 2)+
scale_color_manual(limits = c("advanced_2016",
"intermediate_2016"),
labels = c("Top 2016","Low 2021"),
values = c("blue","red")
)+
scale_shape_manual(limits = c("advanced_2016",
"intermediate_2016"),
labels = c("Top 2016","Low 2021"),
values = c( 17,19)
)+
guides(fill=guide_legend(ncol=1) ,
color=guide_legend(ncol=1)
) +
theme(legend.position = "bottom",
legend.title = element_blank(),
legend.key = element_blank()
)