Hoe kan ik ontbrekende factorcategorieën toch met een kleur tonen in een ggplot-legende? #378
|
Via het argument Echter, voor de categorieën die niet voorkomen in de data wordt er geen kleur getoond in de legende. Hieronder mijn reprex: library(tidyverse)
# Create the dataframe
df_to_visualise <- data.frame(
year = seq(2011, 2016),
estimate = c(0.535, 0.069, 0.328, 0.358, 0.189, 0.551),
lcl = c(0.315, 0.032, 0.095, 0.086, 0.019, 0.311),
ucl = c(0.697, 0.536, 0.549, 0.763, 0.411, 0.681),
effect_coarse = c("uncertain", "decrease", "decrease", "uncertain",
"decrease", "uncertain")
) %>%
mutate(
effect_coarse = factor(
effect_coarse,
levels = c(
"increase",
"stable",
"decrease",
"uncertain"
),
ordered = TRUE
)
)
df_to_visualise %>%
ggplot(aes(x = year)) +
geom_hline(
yintercept = 0.6,
linetype = "longdash",
colour = "black"
) +
geom_hline(
yintercept = c(0.5, 0.7),
linetype = "dotdash"
) +
geom_errorbar(
aes(
ymin = lcl,
ymax = ucl,
colour = effect_coarse
),
linewidth = 1.5
) +
geom_point(
aes(y = estimate),
colour = "black",
size = 3.5
) +
scale_colour_manual(
values = c(
"chartreuse3",
"gold",
"firebrick1",
"skyblue"
),
drop = FALSE
) +
labs(
y = "evenness",
colour = "Effect"
) +
scale_y_continuous(limits = c(0, 1)) +
scale_x_continuous(
breaks = sort(unique(df_to_visualise$year))
)Created on 2026-08-17 with reprex v2.1.1 |
Replies: 1 comment 1 reply
|
Er wordt een gelijkaardig geval besproken op Stack Overflow: ggplot legend showing blank fill for missing factor level. Sinds ggplot2 3.5.0 moet je expliciet aangeven dat een geom ook in de legende moet worden opgenomen voor categorieën die niet in de data voorkomen. In dit geval kan je daarom geom_errorbar(
aes(
ymin = lcl,
ymax = ucl,
colour = effect_coarse
),
linewidth = 1.5,
show.legend = TRUE
)In combinatie met |

Er wordt een gelijkaardig geval besproken op Stack Overflow: ggplot legend showing blank fill for missing factor level.
Sinds ggplot2 3.5.0 moet je expliciet aangeven dat een geom ook in de legende moet worden opgenomen voor categorieën die niet in de data voorkomen.
In dit geval kan je daarom
show.legend = TRUEtoevoegen aangeom_errorbar():geom_errorbar( aes( ymin = lcl, ymax = ucl, colour = effect_coarse ), linewidth = 1.5, show.legend = TRUE )In combinatie met
drop = FALSEinscale_colour_manual()zorgt dit ervoor dat ook de ontbrekende factorniveaus (increaseenstable) in de legende worden opgenomen met hun toegewezen kleur.