Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在ggplot中的公共值周围添加矩形_R_Ggplot2 - Fatal编程技术网

R 在ggplot中的公共值周围添加矩形

R 在ggplot中的公共值周围添加矩形,r,ggplot2,R,Ggplot2,当我进行实验设计时,我使用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这里有一个可能更简单的解决方案。只需使用alpha设置为0的geom_tile。我没有花时间给你一个精确的答案,但这

当我进行实验设计时,我使用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这里有一个可能更简单的解决方案。只需使用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)

df这里是一个可能的解决方案,我创建了一个辅助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) 

我认为我自己的(非理想的)解决方案值得发布,因为我似乎没有什么明显的遗漏。我不回答这个问题,希望有人能想出一些办法

目前,我使用geom_rect的方式很可能是通用的(可能是将geom_边界添加到ggplot??)。对于我问题中的示例,基本信息是每个主图是3x2

再加上原始问题中的
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)

df.p1您可以在指定位置绘制垂直线和水平线。它们是否都必须位于一个封装区域?如果你所说的“某些结构”是指在你的实验中可能存在的阻塞因素,我认为一种直观的方法是将它们分面,这也允许使用漂亮的标签,并提供基本相同的视觉分离。如果您通过mainplot包装上述df,它会立即显示“阻塞”因子会产生各种不希望的行和列对混淆。您的示例中有一个额外的括号,它应该是:
df@distribeecology-感谢您指出这一点,已修复now@AndyW:完全合理的建议,但这实际上是一个阻碍因素。理想情况下,我希望能够对多个级别的“块”(虽然主图不是块,但来自条形图设计)执行此操作。所以不幸的是,刻面在这里没有帮助。我不确定它是否真的那么简单-我已经对它进行了公平的研究,我认为复杂的原因在于,你不能仅仅重新定义轴来让它工作。例如,mainplot 1需要位于3 x 2区域(行x列)周围。当我应用您的方法时,每个绘图都是绑定的,而不是它们的组。不过我还是很欣赏这个想法。顺便说一下,你可以做填充=“透明”,而不是填充+ alpha设置。谢谢,这肯定是可行的,但它可能与我当前的解决方案相吻合,我也会发布。考虑到这一点,我接受你的答案,一般解决方案的应用非常接近。我确信目前没有简单的解决方案。
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) 
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)