Kar*_*mer 2 r ggplot2 facet-wrap
这基本上是同样的问题这一个,但有一个重要的区别:我想基于GGPLOT2瓦情节与横板,并在所有拼贴的高度相等。另一个问题是关于垂直面板。
这是一些示例代码,基于另一个问题中的代码:
d = data.frame(sites=rep(paste("S", 1:31),each=12),
               month=factor(rep(1:12,31)),
               value=runif(31*12),
               panel=c(rep("Group 1",16*12), rep("Group 2", 12*12),
                       rep("Group 3", 3*12)))
绘制这个使用
ggplot(d, aes(x=month, y=sites, fill=value)) + 
  geom_tile(colour="white") + facet_wrap(~panel, nrow=1)
结果是 
基本上,我希望每一块蓝色瓷砖向上移动,这样它们上方就没有空间。我可以使用
ggplot(d, aes(x=month, y=sites, fill=value, colour="white")) + 
  geom_tile(colour="white") + facet_wrap(~panel, scales="free_y", nrow=1)
但这会导致高度不等的瓷砖:

另一个问题对垂直面板有一个很好的解决方案,但将其应用于上述代码无效。水平面板有类似的解决方案吗?
这是一个使用gridExtra和设置关卡的技巧:
d.splt <- split(d, d$panel)
max.unique <- max(sapply(d.splt, function(x) length(unique(x$sites))))
d.gg <- lapply(d.splt, function(d.sub){
  lvls <- unique(as.character(d.sub$sites))
  length(lvls) <- max.unique
  lvls <- replace(lvls, is.na(lvls), "")
  d.sub$sites <- factor(as.character(d.sub$sites), levels=lvls)
  ggplot(d.sub, aes(x=month, y=sites, fill=value, colour="white")) + 
    geom_tile(colour="white", stat="identity") +
    scale_y_discrete(drop=F) + scale_fill_continuous(guide=F)
} )
library(gridExtra)
do.call(grid.arrange, c(d.gg, list(nrow=1)))

这会抛出一些警告,但您可以忽略它们。此外,您还需要添加标题和图例(您可能会弄乱逻辑,因此最后一个会产生图例)。
这样做的主要问题是色标将独立地适合每个图形,但您可以强制修复它。