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

如何结合coord_flip与facet_nested实现特定嵌套分面布局

实现带嵌套标题的翻转分面图表

需求说明

需要创建1列3个堆叠的分面图表,满足以下布局要求:

  • 一级分面标题group水平显示在每个分面顶部
  • 二级分面标题title垂直显示在左侧并关联对应分面
  • regressor名称显示在图表右侧
  • 实现类似coord_flip的翻转效果

最小可复现数据

data <- 
structure(list(cilow = c(0.0528306698161456, 0.0708961798923575, 
-0.0860844842473584, 0.149293656874665, 0.175348742108531, 0.00150087452513042
), fullest = c(0.194641049761067, 0.282228250041396, 0.107053849480737, 
0.296390973553158, 0.38517505087032, 0.205531742216253), cihigh = c(0.336451429705988, 
0.493560320190435, 0.300192183208833, 0.443488290231651, 0.595001359632109, 
0.409562609907376), regressor = c("1. Plant 1", "2. Plant 2", 
"3. Plant 3", "4. Plant 4", "5. Plant 5", "6. Plant 6"), group = c("A. Green", 
"A. Green", "A. Green", "B. Blue", "B. Blue", "C. Red"), title = c("(i) Flowers", 
"(i) Flowers", "(i) Flowers", "(i) Flowers", "(ii) Trees", "(ii) Trees"
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

尝试的初始代码

ggplot(data, aes(forcats::fct_rev(regressor), fullest)) +
    geom_hline(yintercept = 0, linetype = "dashed", size = 0.3) +
    geom_errorbar(
      aes(ymin = cilow, ymax = cihigh),
      width = 0, size = 0.8) +
    geom_point(
      show.legend = F) +
    theme_bw() +
    facet_nested(. ~ group + title, scales = "free", space = "free")
    facet_wrap(. ~ group, cols = 1)

解决方案

可以通过ggh4x包的facet_nested配合coord_flip及主题调整实现需求,完整代码如下:

library(ggplot2)
library(ggh4x)

ggplot(data, aes(y = forcats::fct_rev(regressor), x = fullest)) +
  # 翻转后用垂直参考线替代水平参考线
  geom_vline(xintercept = 0, linetype = "dashed", size = 0.3) +
  # 调整误差棒的高度参数(翻转后对应原宽度)
  geom_errorbar(
    aes(xmin = cilow, xmax = cihigh),
    height = 0, size = 0.8
  ) +
  geom_point(show.legend = FALSE) +
  theme_bw() +
  # 嵌套分面:把title放在y轴侧(左侧),group作为顶部标题
  facet_nested(title ~ group, scales = "free_y", space = "free_y", switch = "y") +
  # 翻转坐标系
  coord_flip() +
  # 主题调整实现标题和标签的布局
  theme(
    # 左侧二级标题(title)垂直显示(角度设为0实现水平排版,对应垂直方向)
    strip.text.y.left = element_text(angle = 0),
    # 可选:去掉左侧标题的背景框
    strip.background.y = element_blank(),
    # 把regressor标签对齐到右侧
    axis.text.y = element_text(hjust = 0),
    # 顶部一级标题(group)居中显示
    strip.text.x = element_text(hjust = 0.5),
    # 给顶部标题添加浅灰色背景区分
    strip.background.x = element_rect(fill = "lightgray")
  ) +
  # 移除冗余的轴标题
  labs(y = NULL, x = NULL)

关键调整说明

  1. 坐标系与映射:先交换aes中的x/y变量,配合coord_flip()确保翻转后元素位置正确
  2. 嵌套分面设置:facet_nested(title ~ group)实现二级标题(title)和一级标题(group)的嵌套,switch="y"将title标签移到左侧y轴区域,scales="free_y"和space="free_y"保证每个分面只显示对应regressor
  3. 主题细节:通过strip.text.y.left调整左侧标题的显示角度,axis.text.y将regressor标签对齐到右侧,实现需求的布局效果

内容的提问来源于stack exchange,提问作者lethalSinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:22