7

当我进行实验设计时,我使用 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 和一些需要针对每个设计进行调整的杂乱代码来生成如下内容:

主情节设计

问题:如何以简单的方式在主图周围添加矩形?这似乎是一个足够简单的问题,但我还没有找到明显的方法。我可以将颜色或其他美学映射到主图,但我似乎无法用盒子包围它们。任何指针都非常感谢。

4

3 回答 3

6

这是一个可能的解决方案,我创建了一个辅助 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-01T01:35:37.700 回答
2

这是一个可能更容易的解决方案。只需geom_tile在 alpha 设置为 0 的情况下使用。我没有花时间给你一个确切的解决方案,但这里有一个例子。为了实现你想要的,我猜你需要实际创建一个新的数据框,这应该很容易。

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-11-30T23:32:21.307 回答
0

我认为发布我自己的(非理想)解决方案是值得的,因为我似乎没有什么明显的遗漏。我将留下未回答的问题,希望有人能提出一些建议。

目前,我以一种可能可以通用的方式使用 geom_rect (可能是在 ggplot 中添加 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)

丑陋,我知道 - 所以这个问题。该代码从问题中生成第二个图。也许最好的选择是将这一切都构建到一个函数中。

于 2012-12-03T03:23:51.930 回答