web-dev-qa-db-fra.com

R - commande en boxplot

J'essaie de produire une série de boîtes à moustaches en R qui est groupée par 2 facteurs. J'ai réussi à faire l'intrigue, mais je n'arrive pas à commander les boîtes dans le bon sens.

Ma batterie de données que j'utilise ressemble à ceci:

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

J'ai essayé:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

cela a ordonné les boîtes par ordre alphabétique (les trois premiers étaient les traitements "élevés", puis parmi ces trois, ils étaient classés par nom d'espèce par ordre alphabétique).

alt text

Je veux que l'intrigue soit ordonnée Bas> Moyen> Haut puis dans chacun de ces groupes G> R> B pour l'espèce.

J'ai donc essayé d'utiliser un facteur dans la formule:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")

ensuite:

boxplot(mydata$Nitrogen~f)

cependant, les boîtes continuent de rentrer dans le même ordre. Les étiquettes sont désormais différentes, mais les cases n'ont pas bougé.

J'ai retiré chaque ensemble de données et les ai tracées toutes ensemble individuellement:

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)

Cela donne ce que je veux, mais je préférerais le faire d'une manière plus élégante, donc je n'ai pas besoin de les retirer individuellement pour des ensembles de données plus volumineux.


Données chargeables:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))
26
Robert

Les commandes suivantes créeront l'ordre dont vous avez besoin en reconstruisant les facteurs de traitement et d'espèces, avec un ordre manuel explicite des niveaux:

mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))

alt text


modifier 1: oups, je l'avais réglé sur HML au lieu de LMH. fixation.

modifier 2: quel facteur (X, Y) fait:

Si vous exécutez le facteur (X, Y) sur un facteur existant, il utilise l'ordre des valeurs dans Y pour énumérer les valeurs présentes dans le facteur X. Voici quelques exemples avec vos données.

> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed

Cela ne change PAS à quoi ressemble le facteur à première vue, mais cela change la façon dont les données sont stockées.

Ce qui est important ici, c'est que de nombreuses fonctions de tracé tracent l'énumération la plus basse à gauche, suivie de la suivante, etc.

Si vous créez des facteurs simplement en utilisant factor(X), alors l'énumération est généralement basée sur l'ordre alphabétique des niveaux de facteur (par exemple "H", "L", "M"). Si vos étiquettes ont un ordre conventionnel différent de l'ordre alphabétique (c'est-à-dire "H", "M", "L"), cela peut rendre vos graphiques étranges.

À première vue, il peut sembler que le problème est dû à l'ordre des données dans le bloc de données - c'est-à-dire que si seulement nous pouvions placer tous les "H" en haut et "L" en bas, alors cela fonctionnerait. Ce n'est pas le cas. Mais si vous souhaitez que vos étiquettes apparaissent dans le même ordre que la première occurrence dans les données, vous pouvez utiliser ce formulaire:

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
30
Alex Brown

Cette question précédente de StackOverflow montre comment réorganiser un boxplot en fonction d'une valeur numérique; ce dont vous avez besoin ici est probablement juste un passage de factor au type connexe ordered. Mais c'est difficile à dire car nous n'avons pas vos données et vous n'avez pas fourni d'exemple reproductible.

Modifier En utilisant l'ensemble de données que vous avez publié dans la variable md et en vous appuyant sur la solution que j'ai indiquée plus tôt, nous obtenons

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))

ce qui crée le graphique que vous cherchiez à créer.

Ceci est également équivalent à l'autre solution présentée ici.

11
Dirk Eddelbuettel