如何用ggplot2为facet_wrap分面添加分组子标题并同行展示
问题描述
想要用ggplot2的facet_wrap将多个小提琴图整合,数据包含color和group两个分组变量,每个color类别下对应不同的group类别。当前用facet_wrap(color ~ group)实现了分面,但每个分面都会重复显示color和group名称,需求是:
- 相同
color的分面处于同一行 - 每个
color仅在对应行的顶部显示一次,无需每个分面重复显示
现有示例数据和绘图代码如下:
示例数据
score<-c(1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10,1:10) color<-c("white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","white","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","black","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","grey","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown","brown") group<-c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","C","C","C","C","C","C","C","C","C","C","C","C","C","C","C","C","D","D","D","D","D","D","D","D","D","E","E","E","E","E","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","G","G","G","G","G","G","G","G","G","G","G","G","G","G","G","H","H","H","H","H","H","H","H","H","H","H","H","H","H","H","I","I","I","I","I","I","I","I","I","I","I","I","I","I","I") animal<-c("dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","dog","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","cat","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny","bunny") df<-tibble(animal,score,group,color)
当前绘图代码
ggplot(df,aes(x=animal,y=score,fill=animal)) + geom_violin()+ facet_wrap(color ~ group)+ theme_clean()
解决方案
可以通过两种方式实现需求:
方法1:使用facet_grid(ggplot2原生)
facet_grid支持按行和列分别指定分组变量,将color设为行变量,group设为列变量,同一color的分面会自动处于同一行,且color仅在每行的左侧显示一次。如果希望color标题显示在顶部,可通过主题参数调整:
ggplot(df,aes(x=animal,y=score,fill=animal)) + geom_violin()+ facet_grid(rows = vars(color), cols = vars(group), scales = "free_x") + theme_clean() + theme( strip.placement = "outside", strip.text.y = element_text(angle = 0) )
方法2:使用ggh4x包的嵌套分面(更贴合需求)
ggh4x的facet_nested支持嵌套分面,可将color作为上层分面,group作为下层分面,实现同一color的分面在同一行,且color标题仅横跨该行顶部显示一次:
首先安装并加载ggh4x包:
install.packages("ggh4x") library(ggh4x)
然后绘图:
ggplot(df,aes(x=animal,y=score,fill=animal)) + geom_violin()+ facet_nested(color ~ group, scales = "free_x") + theme_clean()
这种方式下,同一color的所有group分面会排列在同一行,color标题会覆盖该行所有分面的顶部,完全匹配需求。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

