sim*_*bus 4 plot r facet ggplot2 facet-wrap
我正在尝试创建一个图网格,它应该有一个围绕它们的框,一个类似棋盘的标签(即顶部/底部的字母,侧面的数字),以及一条分隔两半网格的垂直线.
我希望使用分面完成它(或足够类似的事情),但是当给定大量图时,facet_grid 不会创建横向标签(如这里),它出现:
testdata <- cbind("ID"=c(rep(1:24, each=10)),
"TT"=c(rep(0:1, each=5)),
"RD"=c(seq(1:5)),
"DV"=rnorm(240, 10, 5))
testdata <- data.frame(testdata)
testplot <- ggplot(data=testdata, aes(x=RD, y=DV)) +
geom_line(colour="black") + geom_point() +
facet_wrap(TT ~ ID, ncol=4)
Run Code Online (Sandbox Code Playgroud)

(facet_wrap 的另一个问题是它不能很好地处理我更喜欢的 ID ~ TT 排序,将这些值显示为 [1,0]、[1,1]、[2,0]、[2,1 ] 然后;而不是更可取的 [1,0], [2,0], [3,0], [1,1], [2,1] ......但这可以解决。)
我考虑过的另一个选择是使用box();但是,这仅适用于单个图(使用 grid.arrange/arrangeGrob 创建对象不起作用)。
最终,我想要一个大致如下的情节。我很高兴有任何建议!

这似乎很接近。

set.seed(1) # for reproducible example
testdata <- data.frame(ID=rep(LETTERS[1:4], each=60),
TT=rep(1:6, each=10),
grp=rep(0:1,each=5),
RD=seq(1:5),
DV=rnorm(240, 10, 5))
library(ggplot2)
library(gridExtra)
ggp <- ggplot(data=testdata, aes(x=RD, y=DV, group=grp)) +
geom_line(colour="black") + geom_point() +
facet_grid(TT ~ ID)+
theme(strip.background=element_rect(fill=NA),
strip.text=element_text(color="red",face="bold",size=15),
strip.text.y=element_text(angle=0))
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.rect(x=0.51,y=0.5,width=0.007,height=0.8,gp=gpar(col=NA,fill="red"))
Run Code Online (Sandbox Code Playgroud)
我grp在您的示例中添加了一个变量,因为您似乎希望每个面板中都有两行。
我们可以使用facet_grid(...)in获得大部分方法ggplot,加上theme(...)使标签为粗体和红色,并关闭条(面标签)背景。
不幸的是,要添加垂直线,需要grid.rect(...)在gridExtra包中使用。正如您可能看到的那样,需要对矩形的位置进行一些调整以使其正确。如果顶部有四个以上的类别,则很可能需要这样做。
AFAIK 没有简单的方法将垂直面标签放在左侧。
作为侧边栏,请注意您不需要,例如,c(rep(...))。rep(...)已经返回一个向量。此外,这很重要,使用data.frame(cbind(...)). 只是data.frame(...)完成同样的事情,速度要快得多,并且不会产生中间矩阵。
为了让我的评论更清楚。
我建议创建一个如下所示的数据框:
ID TT RD DV ColumnLetter RowNumber
1 0 1 12.4734172 A 1
1 0 2 7.1034136 B 2
1 0 3 3.0688039 C 3
1 0 4 -2.4502442 D 4
Run Code Online (Sandbox Code Playgroud)
然后使用
face_grid(RowNumber~ColumnLetter)
Run Code Online (Sandbox Code Playgroud)
根据您的需要格式化。