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).
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))
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"))
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))
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.