Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 如何向ggplot2中的镶嵌面添加常规标签?_R_Label_Facet_Ggplot2 - Fatal编程技术网

R 如何向ggplot2中的镶嵌面添加常规标签?

R 如何向ggplot2中的镶嵌面添加常规标签?,r,label,facet,ggplot2,R,Label,Facet,Ggplot2,我经常为刻面设置数值。 我希望在补充标题中提供足够的信息来解释这些刻面值,类似于axis标题。 标签机选项重复许多不必要的文本,对于较长的可变标题不可用 有什么建议吗 默认设置: 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) 如@Hendy所示,类似于: 由

我经常为刻面设置数值。 我希望在补充标题中提供足够的信息来解释这些刻面值,类似于axis标题。 标签机选项重复许多不必要的文本,对于较长的可变标题不可用

有什么建议吗

默认设置:

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)

如@Hendy所示,类似于:

由于最新的
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)

test除了kohske概述的方法外,您还可以通过更改添加的框添加边框

col=NA

还有,改变

fill=gray(0.5)
为了

如果希望新条与镶嵌面标签匹配


z可能有更好的方法,但您可以:

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

天哪。我只是在找这个,通过谷歌找到的。。。现在看,一分钟前有人问过。根据他的评论,他似乎也在问同样的问题,尽管标题可能暗示着另一种情况。伟大的模型来说明。这正是我的问题——如果我不必解释我的数字方面的类别,那就太好了。这个图应该用一个简单的标签来说明刻面变量是什么。我通过电子邮件询问了ggplot的主要开发者之一Winston Chang(不知道他的所谓手柄)。他不认为这是目前的选择,但可能考虑增加。他建议我在github上添加一个问题,看起来这个问题出现在邮件列表上,Winston让我知道。他创建了一个分支,为顶级标签提供了一个通用的实现。看到线了吗@哈德利:你说得对。总的来说,我不知道这有多难。如果这从未发生过。。。我对ggplot的感激之情依然盛行:)在某个时候,我不再试图与R/ggplot2争吵,而是使用图像编辑器进行一些所需的修改。这里有关于最佳实践的更新吗?--我想知道从版本0.9.3.1开始,这是否仍然是最干净的方法。我在最新的文档版本0.9.3.1中没有看到类似于“此功能”的东西,它提供了与
ggplot\u gtable(ggplot\u build())
相同的
ggplot\u gtable。我认为这仍然是最好的方法。如果我没有弄错的话,这个解决方案不再有效,因为有些函数现在已经被弃用了。@Remi.b现在试试看这不适用于ggplot2 3.2.1和R 3.6.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)))
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