ggplot2:带有框和周围标签的多个图

时间:2014-11-09 00:55:26

标签: r plot ggplot2 facet facet-wrap

我正在尝试创建一个图形网格,它们周围应该有一个方框,类似棋盘的标签(即顶部/底部的字母,两侧的数字),以及分隔两个半部分的垂直线的网格。

我希望使用faceting完成它(或类似的东西),但是当给出大量的图时,facet_grid不会创建侧面标签(如here),它会出现:

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)

enter image description here

(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创建一个对象不起作用)。

最终,我想要一个大致如下的情节。我会对任何建议感到高兴!

Example

2 个答案:

答案 0 :(得分:4)

这似乎非常接近。

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"))

我在您的示例中添加了grp变量,因为您似乎希望每个面板中有两行。

我们可以通过facet_grid(...)中的ggplot以及theme(...)获取大部分内容,以使标签加粗和红色,并关闭条带(构面标签)背景。< / p>

不幸的是,要添加垂直线,需要在grid.rect(...)包中使用gridExtra。正如你可以看到的那样,对矩形的位置进行了一些调整以使其正确。如果你在顶部有四个以上的类别,你可能需要这样做。

AFAIK没有简单的方法将垂直构面标签放在左侧。

作为侧边栏,请注意您不需要,例如c(rep(...))rep(...)已经返回了一个向量。此外,这很重要,使用data.frame(cbind(...))是一个非常糟糕的主意。只有data.frame(...)完成同样的事情,速度更快,并且不会产生中间矩阵。

答案 1 :(得分:0)

让我的评论更清晰。

我建议创建一个如下所示的数据框:

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

然后使用

face_grid(RowNumber~ColumnLetter)

按照您的要求进行格式化。