2

这与这个问题基本相同,但有一个重要区别:我想要一个基于 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)

但这会导致瓷砖高度不等:

在此处输入图像描述

另一个问题对垂直面板有一个很好的解决方案,但是将其应用于上述代码没有效果。水平面板是否有类似的解决方案?

4

2 回答 2

5

这是使用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)))

在此处输入图像描述

这会引发一些警告,但您可以忽略它们。此外,您需要添加标题和图例(您可能会弄乱逻辑,因此最后一个会产生图例)。

这样做的主要问题是色标将独立地适合每个图形,但是您可以强制将其固定。

于 2014-02-13T19:20:29.967 回答
0

我会接受@BrodieG 的解决方案,因为这是对我的问题最通用的解决方案,但我会添加自己的解决方案,对于实际行/站点名称无关紧要的特殊情况,只有(面板内)瓦片行的顺序。在这里,我们可以使用一种技巧,将所有子组中的级别名称更改为行数最多的组中使用的级别名称。示例数据和原始图:

# Example data
set.seed(7)
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)))

# Reorder rows / site names (just to show that the code works properly)
d$sites = reorder(d$sites, d$value, mean)

# Original plot
library(ggplot2)
ggplot(d, aes(x=month, y=sites, fill=value)) + 
  geom_tile(colour="white") + facet_wrap(~panel, nrow=1)

在此处输入图像描述

现在我们只需要更改每个子组的站点名称:

# Fetch the name of the group with the most rows
library(plyr)
d.stat = ddply(d, .(panel), summarise, nrows=length(unique(sites)))
maxpanel = with(d.stat, panel[which.max(nrows)])

# Fetch the levels / rownames of the group with the most rows
levels.maxpanel = levels(droplevels(subset(d, panel==maxpanel))$sites)

# Substitute the levels / row names of the
# biggest group for each subgroup
subs.levels = function(d.sub) {
  levels.subpanel = rev(levels(droplevels(d.sub$sites)))
  d.sub$sites[] = rev(levels.maxpanel)[match(d.sub$sites, levels.subpanel)]
  d.sub
}
d.recoded = ddply(d, .(panel), subs.levels)

# New plot
ggplot(d.recoded, aes(x=month, y=sites, fill=value)) + 
  geom_tile(colour="white") + facet_wrap(~panel, nrow=1) +
  theme(axis.text.y=element_blank()) 

在此处输入图像描述

于 2014-02-14T11:51:21.327 回答