使用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
相关产品推荐
相关产品推荐

