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 ):
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?
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"))
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 )
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
Vous consultez la page de manuel geom_boxplot .
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"))