web-dev-qa-db-fra.com

Boxplots pour les groupes?

J'ai un ensemble de données (test) comme indiqué ci-dessous:

Type    Met1    Met2    Met3    Met4
TypeA   65  43  97  77
TypeA   46  25  76  77
TypeA   44  23  55  46
TypeA   46  44  55  77
TypeA   33  22  55  54
TypeB   66  8   66  47
TypeB   55  76  66  65
TypeB   55  77  88  46
TypeB   36  67  55  44
TypeB   67  55  76  65

J'ai vérifié beaucoup de liens sur les boîtes à moustaches, mais je n'ai toujours pas réussi à définir le type de boîte à moustaches que je veux. Je souhaite une boîte à moustaches avec mon axe X de type A (jaune, orange) pour tous les Mets (Met1, Met2, Met3, Met4). En substance, je veux quelque chose comme ce qui suit (tiré de ici ): 

 enter image description here

J'essaie quelque chose comme

boxplot(formula = len ~ Type , data = test, subset == "TypeA")
boxplot(formula = len ~ Type , data = test, subset == "TypeA", add=TRUE)
Legend(legend = c( "typeA", "typeB" ), fill = c( "yellow", "orange" ) )

Mais je ne suis pas en mesure de résoudre ce problème. Quelqu'un peut-il m'aider à savoir comment puis-je créer de telles boîtes à moustaches sur mes données de test de manière corrigée? 

15
Letin

Une solution avec ggplot2.

Commencez par transformer votre cadre de données test au format long à l'aide de melt:

library(reshape2)
test.m <- melt(test)

Tracer les données:

library(ggplot2)
ggplot(test.m, aes(x = variable, y = value, fill = Type)) +
  geom_boxplot() +
  scale_fill_manual(values = c("yellow", "orange"))

enter image description here

19
Sven Hohenstein

Comme d'autres l'ont dit, vous devez d'abord fondre vos données.

df <- read.table(text="Type    Met1    Met2    Met3    Met4
TypeA   65  43  97  77
TypeA   46  25  76  77
TypeA   44  23  55  46
TypeA   46  44  55  77
TypeA   33  22  55  54
TypeB   66  8   66  47
TypeB   55  76  66  65
TypeB   55  77  88  46
TypeB   36  67  55  44
TypeB   67  55  76  65",header=TRUE)

library(reshape2)
df2 <- melt(df)

boxplot(
  formula = value ~ variable,
  data    = df2,
  boxwex  = 0.25,
  at      = 1:4 - 0.2,
  subset  = Type == "TypeA",
  col     = "yellow",
  main    = "blah",
  xlab    = "x",
  ylab    = "y",
  ylim    = c( 0, ceiling( max( df2$value ) ) + 1 ),
  yaxs    = "i" )


boxplot(
  formula = value ~ variable,
  data    = df2,
  boxwex  = 0.25,
  at      = 1:4 + 0.2,
  subset  = Type == "TypeB",
  col     = "orange",
  add     = TRUE )
5
Roland

comme ça,

test <- structure(list(Type = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L), .Label = c("TypeA", "TypeB"), class = "factor"), 
    Met1 = c(65L, 46L, 44L, 46L, 33L, 66L, 55L, 55L, 36L, 67L
    ), Met2 = c(43L, 25L, 23L, 44L, 22L, 8L, 76L, 77L, 67L, 55L
    ), Met3 = c(97L, 76L, 55L, 55L, 55L, 66L, 66L, 88L, 55L, 
    76L), Met4 = c(77L, 77L, 46L, 77L, 54L, 47L, 65L, 46L, 44L, 
    65L)), .Names = c("Type", "Met1", "Met2", "Met3", "Met4"), 
    class = "data.frame", row.names = c(NA, -10L))


# install.packages("ggplot2", dependencies = TRUE)
require(ggplot2)
require(reshape2)
df <- melt(test)
p <- ggplot(df, aes(factor(variable), value)) + geom_boxplot(aes(fill = Type))
p

enter image description here

Vous consultez la page de manuel geom_boxplot .

3
Eric Fail

Vous pouvez utiliser la fonction reshape pour créer une longue colonne avec toutes les données des colonnes Met1, .., Met4. Il crée également une colonne (temp$time) pour identifier la colonne à partir de laquelle les données proviennent. Vous pouvez l'utiliser pour stratifier votre diagramme à parcelles (temp$Type*temp$time).

df <- read.table(text=
"Type Met1 Met2 Met3 Met4
TypeA   65  43  97  77
TypeA   46  25  76  77
TypeA   44  23  55  46
TypeA   46  44  55  77
TypeA   33  22  55  54
TypeB   66  8   66  47
TypeB   55  76  66  65
TypeB   55  77  88  46
TypeB   36  67  55  44
TypeB   67  55  76  65",header=TRUE)

temp <- reshape(df, direction='long', varying = 2:5, sep='')

boxplot(temp$Met ~ temp$Type*temp$time, col=c("yellow", "orange"))
2
hector