web-dev-qa-db-fra.com

Ajouter de la couleur au boxplot - Erreur "Valeur continue fournie à une échelle discrète"

Il existe probablement une solution très simple à mon problème, mais je n'ai pas trouvé de réponse satisfaisante en ligne.

À l'aide de la commande suivante, j'ai pu créer le graphique en boîte à moustaches suivant et le superposer avec les points de données individuels:

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age))

Il y a plusieurs choses que j'aimerais ajouter/modifier:

1. Modifiez la couleur de la ligne et/ou le remplissage de chaque boxplot (en fonction de "l'âge") en utilisant 6 couleurs différentes de gauche à droite:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

J'ai essayé

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

mais il en résulte un "Continuous value supplied to discrete scale" Erreur.

2. Modifiez la couleur de chaque point de données (en fonction de "l'âge") en utilisant 6 couleurs différentes de gauche à droite:

c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00")

J'ai essayé:

ggplot(data = MYdata, aes(Age, Richness)) + 
  geom_boxplot(aes(group=Age)) + 
  geom_point(aes(color = Age)) + 
  scale_colour_manual(values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) 

mais cela entraîne également une erreur:

Valeur continue fournie à une échelle discrète

. Remplacez le texte de la légende par "0 mois", "1 mois", "3 mois", "6 mois", "9 mois", "12 mois"

38
Dalmuti71

Premièrement, il serait utile de fournir des exemples de données. Puisque vous ne l'avez pas fait, en voici:

MYdata <- data.frame(Age = rep(c(0,1,3,6,9,12), each=20),
                    Richness = rnorm(120, 10000, 2500))

Les parties 1 et 2 découlent du même problème. Age est une variable continue, mais vous essayez de l'utiliser dans une échelle discrète (en spécifiant la couleur pour des valeurs d'âge spécifiques). En général, une échelle mappe la variable au visuel; pour un âge continu, il existe une couleur correspondante pour chaque valeur d'âge possible, pas seulement celles qui apparaissent dans vos données. Cependant, vous pouvez simultanément traiter l'âge comme une variable catégorielle (facteur) pour une partie de l'esthétique. Pour la troisième partie de votre question, dans la description de l'échelle, vous pouvez définir des étiquettes spécifiques correspondant à des ruptures spécifiques dans l'échelle. Mettre tout cela ensemble (et ajouter quelque chose pour vous donner l'axe x étiqueté plus comme ce que vous avez dans l'exemple):

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(fill=factor(Age))) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00")) +
  scale_fill_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

enter image description here

Avec ce jeu de couleurs, les points qui se trouvent à l'intérieur du boxplot ne sont pas visibles (car ils sont de la même couleur que le remplissage du boxplot). Il serait peut-être préférable de laisser le boxplot creux et de dessiner ses lignes dans la couleur.

ggplot(data = MYdata, aes(x = Age, y = Richness)) + 
  geom_boxplot(aes(colour=factor(Age)), fill=NA) + 
  geom_point(aes(color = factor(Age))) +
  scale_x_continuous(breaks = c(0, 1, 3, 6, 9, 12)) +
  scale_colour_manual(breaks = c("0", "1", "3", "6", "9", "12"),
                      labels = c("0 month", "1 month", "3 months",
                                 "6 months", "9 months", "12 months"),
                      values = c("#E69F00", "#56B4E9", "#009E73", 
                                 "#F0E442", "#0072B2", "#D55E00"))

enter image description here

Enfin, considérez si vous avez vraiment besoin de colorer chaque âge différemment, car ils sont déjà bien définis par l'axe des x.

51
Brian Diggs