2013-02-26 26 views
2

我已經整理成子類別和子子類別的數據集,沿着嵌套的子彈點線:使用ggplot繪製整個數據集和子集

-1 
-1a 
    -1ai 
    -1aii 
-1b 
    -1bi 

...等等。

我想用GGPLOT2作出點陣圖表示隨後數據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 

我想用一個圖表,看起來像這樣結束:

subset and overall data dotplot

我能夠做大量的子集,使這一情節和用來製作大量冗餘的衍生數據框架,但這似乎是做錯了一個明顯的例子。

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

我有點困惑你想要繪製什麼...但你可以使用'interaction'來獲得這個效果......'ggplot(x,aes(x = value,y = interaction(cat,subA,subB)))+ geom_point()'。 (也就是你在繪圖步驟中調用的函數「desc」不適用於我們大多數人。它來自哪裏? – Justin 2013-02-26 15:46:29

+0

交互只似乎在其子子類別中繪製結果(即1.ai,1。 a.ii等)我想顯示價值在整體分佈以及子類別中的價值 – patabongo 2013-02-26 15:54:39

+0

哎呦,這是來自plyr包,我會編輯這個問題 – patabongo 2013-02-26 15:55:43

回答

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() 

ggplot2_multiple_levels

注:你應該重新排序ycat列的水平以您想要的方式訂購y軸。我會把它留給你。

編輯:繼@賈斯汀的建議,你可以做這樣的事情:

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

ggplot2_multiple_levels_color_shape