2016-12-23 2 views
2

La question peut ressembler à celui-ci: Colouring different group data in boxplot using r, mais je dois souligner des colonnes spécifiques et trouvé ceci: http://www.r-graph-gallery.com/23-add-colors-to-specific-groups-of-a-boxplot/Reordering et la coloration des données de groupe spécifiques à boxplot, en utilisant R

De plus, je suis le tri des graphiques par dire, de façon similaire à ceci: Sorting a boxplot based on median value

Le résultat final devrait être quelque chose comme ceci:

bymean <- with(data, reorder(sample, trait, mean, na.rm = TRUE)) 
boxplot(trait~bymean, data=data, 
     col=ifelse(levels(data$sample)=="cpt2", "red", 
      ifelse(levels(data$sample)=="cpt12", "blue", 
      ifelse(levels(data$sample)=="cpt13", "green", 
      ifelse(levels(data$sample)=="cpt30", "yellow", "grey"))))) 

maintenant. Lorsque je change de "trait", j'explique que les données seront réordonnancées et que les couleurs seront réorganisées de nouveau, couplées aux données. Mais ça ne marche tout simplement pas. Les couleurs sont définies en fonction de l'ordre alphabétique des échantillons: bleu (cpt12), vert (cpt13), rouge (cpt2) et jaune (cpt30), peu importe où les échantillons, après réorganisation, sont sur l'axe des x.

Une version plus petite du fichier d'origine availble ici: https://drive.google.com/file/d/0B1kEh3I4podcaUd5NWJaNkhPS0E/view

Répondre

1

L'ordre du vecteur de couleurs permet d'aligner avec l'ordre des cases tracées. Par conséquent, si l'ordre des boîtes dans le boxplot se réarrange alors il faut réarranger les couleurs. Dans votre cas, vous réarrangez l'ordre des niveaux dans la première ligne de code.
Dans cette solution, je crée une trame de données pour correspondre aux niveaux attendus avec la couleur désirée et inclure une valeur par défaut supplémentaire. Ensuite, en utilisant la fonction de correspondance, je crée le vecteur de couleurs dans le bon ordre.

Essayez ceci:

bymean <- with(data, reorder(sample, trait, mean, na.rm = TRUE)) 
colordf<-data.frame(fac=c("cpt2", "cpt12", "cpt13", "cpt30", NA), 
        color = c("red", "blue", "green", "yellow", "grey")) 

plotcolor<-colordf$color[match(levels(bymean), colordf$fac, nomatch=5)] 

boxplot(trait~bymean, data=data, 
     col=plotcolor) 
+1

plotcolor <-colordf $ couleur [match (niveaux (bymedian), colordf $ fac, nomatch = 5)] à plotcolor <$ -colordf couleur [match (niveaux (bymean), colordf $ fac, nomatch = 5)] –

+0

Merci, fait la correction. – Dave2e

+0

Ajouté le fichier d'origine –