在ggplot2中嵌套了facet_wrap()

时间:2016-03-24 14:07:44

标签: r ggplot2

说我有这些数据:

set.seed(100)
mydf<-
data.frame(
day = rep(1:5, each=20),
id = rep(LETTERS[1:4],25),
x = runif(100),
y = sample(1:2,100,T)
)

如果我只想使用id=="A"绘制facet_wrap()的所有五天,我们会这样:

ggplot(mydf[mydf$id=="A",], aes(x,y))  +  
       geom_tile() +
       facet_wrap(~day,ncol=1) 

给出: enter image description here

但是,如果我想在2x2网格中自动绘制其中的四个(即显示A,B,C,D),那么使用嵌套小平面是否可能?我尝试在函数中执行多个变量,如下所示:

ggplot(mydf, aes(x,y))  +  
  geom_tile() +
  facet_wrap(~ day+id) 

但是这样做了:

enter image description here

我正在寻找一种嵌套的方法。每个面板中每天五个刻面行,每个绘图按列/行按id。显然,对于少量的情节,我可以单独保存并安排grid.arrange等,但在实际数据中我有很多情节,所以如果可能的话想要自动化。

编辑:

回应评论 - 这是一种理想的输出:

enter image description here

2 个答案:

答案 0 :(得分:2)

以下是使用multiplot找到的ids = levels(as.factor(mydf$id)) p = vector("list", length(ids)) names(p) = ids for(i in 1:length(ids)){ p[[i]] = ggplot(mydf[mydf$id == ids[i],], aes(x,y)) + geom_tile() + ggtitle(paste(ids[i])) + facet_wrap(~day, ncol=1) } multiplot(p$A, p$B, p$C, p$D, cols = 2) 函数的快速尝试

t

here

答案 1 :(得分:2)

试试这个,

p <- ggplot(mydf, aes(x,y))  +  
  geom_tile() +
  facet_wrap(~ day, ncol=1) 

library(plyr)
lp <- dlply(mydf, "id", function(d) p %+% d + ggtitle(unique(d$id)))
library(gridExtra)
grid.arrange(grobs=lp, ncol=2)

enter image description here