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

使用facet_grid绘制多行x轴标签时分面自定义标签重复如何解决

解决思路与修改后代码

问题根源:你遇到的标签重复问题,核心是你给x轴传入了全局的15个标签,但facet_grid每个分面的x轴是独立取值的,每个分面会默认从你传入的标签向量头部开始取对应数量的标签,就出现了每个分面都重复显示A/B/C的问题。

主要改动逻辑:

  • 简化x轴映射:不需要用interaction生成复合x轴变量,直接使用原始scale列作为x轴即可,分面已经自动按scale_group拆分了数据,每个分面内的scale值都是唯一的
  • 绑定标签与x轴水平:用命名向量将每个scale值和对应的标签绑定,保证每个分面读取到正确的标签,不会重复
  • 调整分面标签位置:通过facet_grid的strip.position参数和theme的strip.placement参数,让SCALE分组标签显示在x轴字母标签的上方
library(tidyverse)
library(janitor)

# 原始数据生成逻辑不变
scale <- c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o")
score <- rep(10, 15)
input <- data.frame(scale, score)
input <- t(input)
names(input) <- input[, 1]
input <- data.frame(row_to_names(input, row_number = 1))

df <- data.frame(rbind(
  input$a, input$b, input$c, input$d,
  input$e, input$f, input$g, input$h, input$i,
  input$j, input$k, input$l,
  input$m, input$n, input$o)) %>%
  rownames_to_column(var = "scale") %>%
  rename(scale_score = 2) %>%
  mutate(scale_group = c("SCALE1", "SCALE1", "SCALE1", "SCALE1",
                         "SCALE2", "SCALE2", "SCALE2", "SCALE2", "SCALE2", 
                         "SCALE3", "SCALE3", "SCALE3", 
                         "SCALE4", "SCALE4", "SCALE4"))

df$scale_group = factor(df$scale_group, levels = c("SCALE1", "SCALE2", "SCALE3", "SCALE4"))
df$gp <- c(1,1,1,1,2,2,2,2,2,3,3,3,4,4,4)

# 生成标签命名向量,和scale一一对应避免匹配错误
labels = c("A", "B", "C", "(D)",
           "E", "F", "G", "(H)", "(I)",
           "J", "K", "(L)",
           "M", "N", "(O)")
label_vec <- setNames(labels, df$scale)

# 修改后的绘图代码
df %>%
  ggplot(aes(x=scale, y=as.numeric(scale_score), 
             group=interaction(scale_group, gp))) +
  theme_bw() +
  geom_line(stat="identity") + 
  geom_point(size=2, color="blue") +
  geom_rect(aes(xmin = -Inf, xmax = Inf, ymin = 9.5, ymax = 10.5),
            alpha = 0.015, fill = "darkturquoise") +
  scale_y_continuous(breaks = seq(0, 20, by = 1), limits = c(0,20)) +
  # 用绑定好的命名向量做标签,避免重复
  scale_x_discrete(position = "top", labels = label_vec) +
  xlab("") + ylab("") +
  ggtitle("标签显示正常效果") + 
  theme(plot.title = element_text(hjust = 0.5),
        # 调整分面标签样式,让它显示在x轴上方,背景透明更协调
        strip.placement = "outside",
        strip.background = element_blank(),
        strip.text = element_text(size = 10, face = "bold")) +
  # 加strip.position参数,让分面条在顶部
  facet_grid( ~ scale_group,
              scales = "free", space = "free",
              strip.position = "top")

运行上述代码后,x轴每个标签会正常显示A到(O)不会重复,且SCALE1~SCALE4的分组标签会显示在对应分面x轴标签的上方,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:24:06