【问题标题】:ggplot2 facet_grid() strip_text_x() different colours based on factorggplot2 facet_grid() strip_text_x() 基于因子的不同颜色
【发布时间】:2014-03-17 15:10:14
【问题描述】:

有没有办法为 ggplot2 的 facet_grid 中的 facet 的名称或去除背景(不是实际网格的背景,如本文中已回答:Conditionally change panel background with facet_grid?)着色?

在以下示例中:

#create simple dataframe for plotting
xy <- data.frame(x = rep(1:10, times=3), y = rep(10:1, times=3), type = rep(LETTERS[1:2], each=5), type2 = rep(LETTERS[3:5], each=10), category = rep(c("control", "exp", "control"), each=10))
xy
#create base plot
plot <- ggplot(data = xy)+
geom_point(aes(x = x, y = y))+
facet_grid(type ~ type2)

#plot base plot   
plot

有没有办法根据分类变量为主题的文本或背景着色(strip.text.x = element_text(size = 11, face="bold")) (?strip.background.x?) (例如,我上面指定的数据框中的“类别”,所以所有控件都有一个红色条,所有的 exp - 一个绿色)?

提前致谢!

PS 我真正想做的是展示一个生物实验的结果:

  • 每个基因的两个箱线图显示变异性;基因名称在条带中

  • 网格的背景是白色或灰色,灰色表示控制基因

  • 我想使用标题中文本的颜色来表示该基因在我的实验中是否重要(我需要在同一个图中显示已验证和未验证的基因)

【问题讨论】:

  • 我很好奇this 是否仍然有效。

标签: r ggplot2


【解决方案1】:

@Roland 教我破解this question 上的grid 图形对象:

根据他的建议,您可以(hackily)遍历复杂的 grob 对象并随意更改元素(但请记住,ggplot 的设计目的是让您在很长时间内摆脱这些决定很好的理由 - 你可能会做出一些糟糕的图形设计选择!)。

尝试了解以下内容的工作原理,您将能够对其进行扩展以更改其他所有方式 元素。 $gp 基本上是 grid 等效于 par 选项的 base 绘图。

gplot <- ggplotGrob( plot )
nms <- lapply( gplot$grobs , function(x) names( x[]$children ) )
grbs <- which( sapply( lapply( nms , function(x) grepl( "strip.background.rect" , x ) ) , any ) == 1 )
cl <- c("#2b8cbe","#fc9272","#2b8cbe")
for ( i in 1:length(grbs) ){
    col <- cl[i]
    i <- grbs[i]
    gplot$grobs[[i]]$children[[1]][]$gp$fill <- col

}
require(gridExtra)
grid.arrange( gplot )

【讨论】:

  • @simon-ohanlon 谢谢!那行得通,但不幸的是,我不知道该代码在做什么。我似乎无法正确谷歌以了解如何解析 ggplotGrob 对象 - 是否有任何教程?我这样做时得到的 20 个 grobs 是什么:gplot$grobs?
  • 那我莫名其妙地找到了他们的孩子,这是什么? nms
  • 然后我使用 grep 查找具有子项的 grobs 的索引,这些子项的名称包含 strip.background.rect 然后我分配颜色。然后在循环中发生了什么?
  • 另外,我想玩一下 strip_text_x 并更改单词的颜色。我应该使用哪个 grob/grep 字符串?
  • grobs 都是构成情节的元素。恐怕我不知道它们是如何划分的,而且我的知识完全基于反复试验。孩子就是这样,他们是情节的元素,属于顶级元素。我假设您可以设置顶层对象的绘图坐标,并且下面的所有子对象也根据顶层移动。获取与文本相关的grobgrep"strip.text.x.text",对于AB 它是"strip.text.y.text"(检查ams 对象)。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2017-09-12
相关资源
最近更新 更多