我有一个数据集被组织成子类别和子子类别,沿着嵌套的项目符号点:
-1
-1a
-1ai
-1aii
-1b
-1bi
......等等。
我想用ggplot2制作一个点图,显示 1 的所有数据,然后只显示 1a 的数据,然后是 1ai 仅,等等。
示例数据集:
x <- data.frame(cat=1, subA=letters[rep(1:5,each=10)],
subB=as.character(as.roman(rep(1:5,5,each=2))),value=rnorm(50,20,7))
> head(x)
cat subA subB value
1 1 a I 26.75573
2 1 a I 12.52218
3 1 a II 24.53499
4 1 a II 23.21012
5 1 a III 11.18173
6 1 a III 25.01914
我希望最终得到一张如下所示的图表:
我能够通过大量的子集和rbinding来制作一个大规模冗余的衍生数据框,但这似乎就是“做错了”的一个明显例子。
x2 <- with(x,rbind(cbind(key="1",x),
cbind(key="1 a",x[paste(cat,subA) == "1 a",]),
cbind(key="1 a I",x[paste(cat,subA,subB) == "1 a I",]),
cbind(key="1 a II",x[paste(cat,subA,subB) == "1 a II",])))
library(ggplot2)
library(plyr)
ggplot(x2,aes(x=reorder(key,desc(key)),y=value))
+ geom_point(position=position_jitter(width=0.1,height=0))
+ coord_flip() + scale_x_discrete("Category")
有更好的方法吗?一个相关的问题是,如果每个值总是添加相同的抖动量,无论它是针对“1”还是“1 a”或“1 a II”绘制,那将会很好,但是我甚至都没有确定从哪里开始。
答案 0 :(得分:2)
我想不出除了使用单独的组重建数据之外的其他方法,如下所示:
x.m1 <- x[c("cat", "value")]
x.m2 <- do.call(rbind, lapply(split(x, interaction(x[, 1:2])), function(y) {
y$cat <- do.call(paste0, y[, 1:2])
y[c("cat", "value")]
}))
x.m3 <- do.call(rbind, lapply(split(x, interaction(x[, 1:3])), function(y) {
y$cat <- do.call(paste0, y[, 1:3])
y[c("cat", "value")]
}))
y <- rbind(x.m1, x.m2, x.m3)
ggplot(data = y, aes(x = value, y = cat)) + geom_point()
注意:您应该重新排序cat
中y
列的级别,以便按照您想要的方式对y轴进行排序。我会留给你的。
编辑:按照@ Justin的建议,您可以这样做:
x.m1 <- x
x.m1$grp <- x$cat
x.m2 <- do.call(rbind, lapply(split(x, interaction(x[, 1:2])), function(y) {
y$grp <- do.call(paste0, y[, 1:2])
y
}))
x.m3 <- do.call(rbind, lapply(split(x, interaction(x[, 1:3])), function(y) {
y$grp <- do.call(paste0, y[, 1:3])
y
}))
y <- rbind(x.m1, x.m2, x.m3)
ggplot(data = y, aes(x = value, y = grp)) + geom_point(aes(colour=subA, shape=subB))