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

如何在R语言ggplot2中添加X轴次级刻度标签及分组括号?

在ggplot2中添加X轴次级标签及分组括号

要实现需求中的次级X轴标签和分组括号,ggplot2本身没有原生支持离散次级轴的功能,我们可以通过数据预处理、添加注释和调整主题样式来模拟实现。以下是完整方案:

步骤1:数据预处理

首先将原x轴的复合标签拆分为「分组(A/B/C)」和「子组(S. longishname等)」两列,方便后续定位标签位置:

library(ggplot2)
library(dplyr)

df <- data.frame (yaxis = rnorm(120,5,1),
                  xaxis = rep(c("A - S. longishname","B - S. longishname","C - S. longishname","A - S. short","B - S. short", "B - S. med"), 20)) %>%
  mutate(
    group = gsub(" - .*", "", xaxis),       # 提取分组部分
    subgroup = gsub(".* - ", "", xaxis)     # 提取子组部分
  )

步骤2:计算子组的x轴位置

离散x轴的每个类别对应一个整数位置(1到6),我们需要统计每个子组对应的最小、最大和中间位置,用于定位次级标签和括号:

subgroup_info <- df %>%
  distinct(xaxis, subgroup) %>%
  mutate(x_pos = as.integer(factor(xaxis))) %>%
  group_by(subgroup) %>%
  summarize(
    min_x = min(x_pos),
    max_x = max(x_pos),
    mid_x = mean(x_pos)
  )

步骤3:绘制图形并添加次级元素

结合基础绘图、注释和样式调整,实现预期效果:

ggplot(df, aes(x = xaxis, y = yaxis)) +
  # 基础散点图
  geom_point() +
  theme_classic() +
  
  # 主X轴标签:仅保留分组部分并设置为斜体
  scale_x_discrete(labels = ~ paste0(gsub(" - .*", "", .x), "-") %>% italic()) +
  
  # 扩展Y轴底部空间,为次级标签留出位置
  scale_y_continuous(expand = expansion(mult = c(0.25, 0.1))) +
  
  # 添加次级标签(子组名称,居中对齐)
  annotate("text", 
           x = subgroup_info$mid_x, 
           y = 2.8,  # 调整Y位置使其位于主X轴下方
           label = subgroup_info$subgroup, 
           fontface = "italic",
           size = 4) +
  
  # 添加分组括号(由三条线段组成:左竖线、水平线、右竖线)
  geom_segment(data = subgroup_info,
               aes(x = min_x - 0.1, xend = min_x - 0.1, y = 3.1, yend = 3.0),
               color = "black") +
  geom_segment(data = subgroup_info,
               aes(x = min_x - 0.1, xend = max_x + 0.1, y = 3.0, yend = 3.0),
               color = "black") +
  geom_segment(data = subgroup_info,
               aes(x = max_x + 0.1, xend = max_x + 0.1, y = 3.1, yend = 3.0),
               color = "black") +
  
  # 调整主题样式,优化间距
  theme(
    plot.margin = margin(10, 10, 20, 10),  # 调整底部边距避免标签被截断
    axis.text.x = element_text(margin = margin(t = 8))  # 增大主标签与轴线的间距
  )

关键说明

  • 次级标签和括号通过annotate()和geom_segment()实现,模拟次级轴效果;
  • scale_y_continuous(expand = ...)用于扩展Y轴底部空间,确保次级元素可见;
  • 可根据实际数据调整y参数的数值,控制次级标签和括号的垂直位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:54