¿Cómo agregar más de 2 colores a ggplot según las condiciones?

¿Cómo agregar más de 2 colores a ggplot según las condiciones?

Mi pregunta es similar a la que se responde aquí: https://stackoverflow.com/a/12910865/16824530

Sin embargo, aunque me gustaría que todos los valores negativos fueran del mismo color (por ejemplo, azul oscuro), me gustaría que los valores positivos tuvieran colores diferentes para cada año. Sin embargo, cuando hago un vector de color (como el que se muestra a continuación), termino siendo cada barra una mezcla de todos los colores del vector.

vector <- ('2005'='pink', '2010'='green', '2011'='yellow')

Quiero establecer cada año que sea positivo en un color diferente y tener todos los años negativos en un solo color.

Mostrar la mejor respuesta

Puede ampliar la misma idea de la publicación a la que hizo referencia. Esencialmente, puede crear una nueva variable que especifique entre valores positivos y negativos; sin embargo, en lugar de usar "positivo", podemos usar el año. Entonces, todavía podemos usar scale_fill_manual para configurar los colores. Entonces, todos los valores negativos serán de un color. Luego, para cada valor positivo, podemos dar un color único.

library(tidyverse)

df %>% 
  mutate(grp = ifelse(value >= 0, as.character(variable), "negative")) %>% 
  ggplot(aes(x = variable, y = value, fill = grp)) + 
  geom_col() + 
  scale_fill_manual(values = c("negative" = "darkblue", "2002" = "blue", "2003" = "red", 
                               "2004" = "orange", "2005" = "yellow", "2007" = "darkred",
                               "2008" = "purple", "2009" = "green", "2012" = "darkgreen"))

Salida

ingrese la descripción de la imagen aquí

Datos

df <- structure(list(Mealtime = c("Breakfast", "Breakfast", "Breakfast", "Breakfast", 
                                  "Breakfast", "Breakfast", "Breakfast", "Breakfast", 
                                  "Breakfast", "Breakfast", "Breakfast"), 
                     Food = c("Rashers", "Rashers", "Rashers", "Rashers", "Rashers", 
                              "Rashers", "Rashers", "Rashers", "Rashers", "Rashers", "Rashers"), 
                     variable = structure(1:11, .Label = c("2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", 
                                                           "2011", "2012"), class = "factor"), 
                     value = c(9.12, 9.5, 2.04, -20.72, 18.37, 91.19, 94.83,
                               191.96,-125.3,-18.56, 63.85)),
                row.names = c(NA, -11L), class = "data.frame")