如何在ggplot2的构面中添加常规标签?


82

我经常会提供数值作为方面。我希望提供足够的信息来解释补充性标题中的这些构面值,类似于轴标题。标签程序选项会重复很多不必要的文本,并且不适用于较长的变量标题。

有什么建议么?

默认值:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20))
qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

在此处输入图片说明

我想要的是:

在此处输入图片说明

我在ggplot中能做的最好的事情:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)

在此处输入图片说明

如@Hendy所示,类似于: 向ggplot2绘图添加辅助y轴-使其完美


1
天啊。我只是在寻找,是通过google找到的...,现在看到它是在一分钟前被询问的。尽管标题可能暗示相反,但根据他的评论,这个问题似乎是在问同样的问题。伟大的模型来说明。这正是我的问题-如果我不必解释我的数字方面类别,那就太好了。该图应带有一个简单的标签,说明各个方面的变量,从而说明自己。
亨迪2012年

3
我通过电子邮件向主要ggplot开发人员之一Winston Chang(不知道他的SO句柄)咨询。他目前不认为这是一个选择,但可以考虑添加它。他建议我在github上添加一个问题,所以我做到了
Hendy

1
看起来像出现在邮件列表上,温斯顿让我知道。他创建了一个分支,并为顶级标签实现了这一常规实现。看到这里的线程。@哈德利:你是对的。我不知道总体上有多困难。如果这永远不会发生...我仍然对ggplot表示感谢:)
Hendy

1
在某些时候,我不再尝试缠结R / ggplot2并使用图像编辑器进行一些所需的修改。
安迪

2
有关最佳做法的最新信息?
亚瑟·叶

Answers:


49

作为内部的最新ggplot2用法gtable,修改图形非常容易:

library(ggplot2)
test <- data.frame(x=1:20, y=21:40, 
                   facet.a=rep(c(1,2),10), 
                   facet.b=rep(c(1,2), each=20))
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

# get gtable object
z <- ggplotGrob(p)

library(grid)
library(gtable)
# add label for right strip
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))),
                     4, 8, 6, name = paste(runif(2)))

# add label for top strip
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 2", gp = gpar(col = gray(1)))),
                     3, 4, 3, 6, name = paste(runif(2)))

# add margins
z <- gtable_add_cols(z, unit(1/8, "line"), 7)
z <- gtable_add_rows(z, unit(1/8, "line"), 3)

# draw it
grid.newpage()
grid.draw(z)

在此处输入图片说明

当然,您可以编写一个自动添加标签的函数。的未来版本ggplot2可能具有此功能;虽然不确定。


-我想知道从0.9.3.1版开始,这是否仍然是最干净的方法。我在最新文档docs.ggplot2.org/0.9.3.1中看不到
yosukesabai 2013年

1
0.9.3.1版提供ggplotGrob()与相同的功能ggplot_gtable(ggplot_build())。我认为这仍然是最好的方法。
kohske

1
如果我没记错的话,此解决方案将不再有效,因为现已弃用了某些功能。
Remi.b,

1
@ Remi.b立即尝试
rawr

3
这不适用于ggplot2 3.2.1和R 3.6.1。没有错误信息,但我没有在结果图上得到标签。
Calimo

5

也许有更好的方法,但是您可以:

fac1 = factor(rep(c('a','b'),10))
fac2 = factor(rep(c('a','b'),10))
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2)
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2)
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm"))
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0)   # top

1

除了kohske概述的方法外,您还可以在框上添加边框,方法是更改

col=NA

col=gray(0.5), linetype=1

另外,改变

fill=gray(0.5)

对于

fill=grey(0.8)

gp=gpar(col=gray(1))

gp=gpar(col=gray(0))

如果您希望新的条与刻面标签匹配

z <- gtable_add_grob(z, 
      list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))),
      textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))),
      4, 8, 6, name = paste(runif(2)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.