当我进行实验设计时,我会使用ggplot来显示布局。下面是一个简单的例子:
df <- data.frame(Block=rep(1:2, each=18),
Row=rep(1:9, 4),
Col=rep(1:4, each=9),
Treat=sample(c(1:6),replace=F))我将绘制如下图:
df.p <- ggplot(df, aes(Row, Col)) + geom_tile(aes(fill=as.factor(Treat)))给予:

有时,我在设计中有一个结构,我想通过在它周围放置一个框来突出显示它,例如一个主图。在这种情况下:
df$Mainplot <- ceiling(df$Row/3) + 3*(ceiling(df$Col/2) - 1)然后我使用geom_rect和一些杂乱的代码,这些代码需要针对每个设计进行调整,以生成如下内容:

问:如何以一种简单的方式添加主图周围的矩形?这似乎是一个很简单的问题,但我还没有找到一个显而易见的方法。非常感谢任何人的指点。
发布于 2012-12-01 09:35:38
这是一种可能的解决方案,其中我创建了一个辅助data.frame,用于使用geom_rect()绘制边界。我不确定这是不是像你想的那样简单!我希望计算矩形坐标的代码是可重用的/可泛化的,只需做一点额外的工作。
library(ggplot2)
# Load example data.
df = data.frame(Block=rep(1:2, each=18),
Row=rep(1:9, 4),
Col=rep(1:4, each=9),
Treat=sample(c(1:6),replace=F))
df$Mainplot = ceiling(df$Row/3) + 3*(ceiling(df$Col/2) - 1)
# Create an auxiliary data.frame for plotting borders.
group_dat = data.frame(Mainplot=sort(unique(df$Mainplot)),
xmin=0, xmax=0, ymin=0, ymax=0)
# Fill data.frame with appropriate values.
for(i in 1:nrow(group_dat)) {
item = group_dat$Mainplot[i]
tmp = df[df$Mainplot == item, ]
group_dat[i, "xmin"] = min(tmp$Row) - 0.5
group_dat[i, "xmax"] = max(tmp$Row) + 0.5
group_dat[i, "ymin"] = min(tmp$Col) - 0.5
group_dat[i, "ymax"] = max(tmp$Col) + 0.5
}
p2 = ggplot() +
geom_tile(data=df, aes(x=Row, y=Col, fill=factor(Treat)),
colour="grey30", size=0.35) +
geom_rect(data=group_dat, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax),
size=1.4, colour="grey30", fill=NA)
ggsave(filename="plot_2.png", plot=p2, height=3, width=6.5)

发布于 2012-12-01 07:32:21
这里有一个可能更简单的解决方案。只需使用alpha设置为0的geom_tile即可。我没有花时间给你一个确切的解决方案,但这里有一个例子。为了达到你想要的效果,我猜你需要实际创建一个新的数据框,这应该很简单。
df <- data.frame(Block=rep(1:2, each=18),Row=rep(1:9, 4),Col=rep(1:4, each=9),Treat=sample(c(1:6),replace=F))
df$blocking <- rep(sort(rep(1:3,3)),4)
df.p <- ggplot(df, aes(Row, Col)) + geom_tile(aes(fill=as.factor(Treat)))
df.p+ geom_tile(data=df,aes(x=Row,y=blocking),colour="black",fill="white",alpha=0,lwd=1.4)alpha=0将创建一个空白磁贴,然后您可以使用lwd设置线宽。这可能比指定所有矩形更容易。希望能有所帮助。
发布于 2012-12-03 11:23:52
我认为我自己的(非理想的)解决方案是值得发布的,因为我似乎没有遗漏任何明显的东西。我不打算回答这个问题,希望有人能想出点什么来。
目前,我使用geom_rect的方式很可能是通用的(也许可以将其添加到geom_border中)。对于我的问题中的示例,基本信息是每个主图都是3 x 2。
从最初的问题添加到df.p上,这是我目前正在做的:
df.p1 <- df.p + geom_rect(aes(xmin=((Mainplot- 3*(ceiling(Col/2)-1) )-1)*3 + 0.5,
xmax=((Mainplot - 3*(ceiling(Col/2)-1))-1)*3 + 3.5,
ymin=ceiling(ceiling(Col/2)/2 + 2*(ceiling(Col/2)-1))-0.5,
ymax=2*ceiling(Col/2)+0.5),
colour="black", fill="transparent",size=1)丑陋,我知道--这就是问题所在。该代码根据问题生成第二个图。也许最好的选择是将所有这些都构建到一个函数中。
https://stackoverflow.com/questions/13646273
复制相似问题