我想从矩阵创建一个箱形图,其中几个变量按因子的两个级别分组。
一些示例数据:
mymatrix = structure(list(Treatment = structure(c(1L, 2L, 1L, 2L, 1L, 2L,
1L, 2L, 1L, 2L, 2L), .Label = c("con", "treat"), class = "factor"),
c1 = c(13L, 93L, 6L, 3L, 45L, 1L, 69L, 38L, 23L, 48L, 82L
), c5 = c(33L, 79L, 3L, 5L, 17L, 22L, 94L, 99L, 85L, 74L,
9L), c3 = c(96L, 52L, 0L, 6L, 60L, 14L, 69L, 96L, 57L, 99L,
39L), c8 = c(40L, 27L, 94L, 68L, 76L, 73L, 88L, 45L, 67L,
95L, 85L), c12 = c(20L, 14L, 53L, 9L, 93L, 1L, 12L, 45L,
59L, 38L, 25L)), .Names = c("Treatment", "c1", "c5", "c3",
"c8", "c12"), class = "data.frame", row.names = c("1a", "1b",
"2a", "2b", "3a", "3b", "4a", "4b", "5a", "5b", "5c"))
我能够获得每个变量的箱线图,但我无法同时对它们进行分组:
boxplot(as.matrix(mymatrix[,2:6]))
boxplot(as.matrix(mymatrix[,2:6])~Treatment, data=mymatrix)
提前感谢您的帮助。
答案 0 :(得分:2)
v <- stack(mymatrix[-1])
v$Treatment <- mymatrix$Treatment
boxplot(values~Treatment+ind, v)
第一部分会给我们data.frame
这样的话:
values ind
1 13 c1
2 93 c1
...
11 82 c1
12 33 c5
...
22 9 c5
23 96 c3
...
55 25 c12
然后我们追加Treatment
列,并照常插图。
reshape
包as suggested by Drew 更新。
v <- melt(mymatrix, id.vars="Treatment")
boxplot(value~Treatment+variable, v)
答案 1 :(得分:2)
就个人而言,我喜欢使用ggplot2
/ reshape2
方法 - 一开始学习起来可能有点困难,但一旦你擅长它,我认为它会让事情变得更容易。< / p>
请注意,您的“矩阵”实际上不是矩阵,而是数据帧。这很方便,因为我建议的方法只适用于数据框。
str(mymatrix)
'data.frame': 11 obs. of 6 variables:
...
首先,将'重塑'为'long'格式,其中每行代表不同的观察
dfm <- melt(mymatrix, id.vars="Treatment")
(我的惯例是附加任何带有字母m的融化数据框)。
接下来,使用ggplot2
制作图表。我已将Treatment
列映射到x轴,并将c1-c12列(重新整形后命名为variable
)映射到填充颜色,但ggplot2的语法允许您轻松更改它:
ggplot(dfm, aes(x=Treatment, y=value, fill=variable)) +
geom_boxplot()