Estou fazendo um boxplot, mas preciso reordenar os níveis para um fator nos dados. Esse fator será usado no ggplot para refletir os níveis por meio de três cores diferentes. Mas quando os níveis do fator são reordenados, as cores são alteradas ao mesmo tempo, o que não é algo que eu desejo. O código reproduzível é o seguinte,
x1 <- runif(100)
x2 <- c(rep("c", 30), rep("a", 40), rep("b", 30))
x3 <- rep(seq(0,9), 10)
mydata <- as.data.frame(cbind(x1, x2, x3))
mydata$x4 <- factor(mydata$x2, levels = c("a", "b", "c"), ordered = TRUE)
mydata$x1 <- as.numeric(mydata$x1)
mydata$x2 <- as.factor(mydata$x2)
mydata$x3 <- as.factor(mydata$x3)
ggplot(mydata, aes(x = x3, y = x1, fill = x2)) +
geom_boxplot() +
labs(x = "x3", y = "x1") +
theme(plot.title = element_text(hjust = 0.5, size = 12),
legend.position = "top")
Isso me dá os boxplots nessas três cores
Mas se eu mudar x2 para x4 (fator de reordenação), as cores se tornam diferentes!
ggplot(mydata, aes(x = x3, y = x1, fill = x4)) +
geom_boxplot() +
labs(x = "x3", y = "x1") +
theme(plot.title = element_text(hjust = 0.5, size = 12),
legend.position = "top")
Eu ainda quero manter as cores no primeiro gráfico para o fator reordenado, a mesma cor e mesma ordem de cores (primeiro: vermelho, segundo: verde, terceiro: azul). Existe uma maneira de manter as mesmas cores para um fator reordenado?
O problema é que, por padrão,
ggplot2
será usadoscale_fill_ordinal
no caso de uma ordenaçãofactor
(com opçãoordered=TRUE
) que assume como padrão uma paleta de cores viridis, enquanto para uma não ordenação,factor
o padrão seráscale_fill_discrete
aquele que usa uma paleta de cores hue.Uma opção para corrigir isso seria forçar uma escala de cores de preenchimento de matiz explicitamente usando
scale_fill_discrete
ouscale_fill_hue
: