Ajouter de la couleur à boxplot-erreur "valeur continue fournie à l'échelle discrète"

il y a probablement une solution très facile à mon problème mais je n'ai pas pu trouver une réponse satisfaisante en ligne.

en utilisant la commande suivante, j'ai pu créer le graphique boxplot suivant et le superposer avec les différents points de données:

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

Il y a plusieurs choses que je voudrais ajouter/modifier:

1. changer la couleur de la ligne et/ou remplir chaque boxplot (en fonction de "L'âge") en utilisant 6 couleurs différentes de gauche à droit:

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. changer 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 il a également conduit à une erreur:

valeur continue fournie à échelle discrète

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

36
demandé sur zx8754 2012-05-29 23:45:32

1 réponses

tout d'abord, fournir des données d'échantillon serait utile. Puisque vous n'avez pas, 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 proviennent 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 spécifiques de l'âge). En général, une échelle met la variable en correspondance avec le visuel; pour un âge continu, il y a une couleur correspondante pour chaque valeur possible de l'âge, pas seulement celles qui apparaissent dans vos données. Cependant, vous peut traiter simultanément l'âge comme une variable catégorique (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. En regroupant tout cela (et en ajoutant 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 schéma de couleurs, les points qui tombent à l'intérieur du boxplot ne sont pas visible (puisqu'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, puisqu'ils sont déjà bien définis par l'axe des X.

50
répondu Brian Diggs 2012-05-29 21:03:56