You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:27:30