如何在ggplot2的facet_grid中实现各分面独立的x轴序列?
解决ggplot2分面中每个分面x轴从1开始计数的问题
你的代码中x轴使用的是全局数据集的索引序列(seq(length({{y_axis_parameter}}))),所以分面后每个组的x值仍然是全局的位置,而非组内的序号。要实现每个分面x轴从1开始,需要为每个类别生成组内独立的索引,再配合自由缩放的x轴。
修正步骤与代码
1. 修正数据创建(避免类型错误)
原代码中cbind会导致values列被转换为字符类型,先修正这部分:
set.seed(1233) means <- c(rep(20, 20), rep(60, 60), rep(120, 120)) sds <- c(rep(1, 20), rep(2, 60), rep(4, 120)) values <- rnorm(length(means), mean = means, sd = sds) stage <- sample(c(rep("a", 20), rep("b", 60), rep("c", 120))) df <- data.frame(values, stage) # 直接传入列,保留数值类型 rm(values)
2. 修改绘图函数,生成组内索引并启用自由x轴
使用dplyr的group_by()和row_number()为每个类别生成组内的连续索引,同时在facet_grid中设置scales='free_x'让每个分面的x轴独立缩放:
library(tidyverse) graph_builder <- function(data_set, y_axis_parameter, category, attribute_name) { # 为每个类别生成组内的x索引(从1开始) data_processed <- data_set %>% group_by({{category}}) %>% mutate(x = row_number()) %>% ungroup() graph <- ggplot(data_processed, aes(x = x, y = {{y_axis_parameter}}, colour = {{category}})) + geom_line() + geom_point() + facet_grid(cols = vars({{category}}), scales = "free_x") + # 启用自由x轴 ylab(paste0(attribute_name, " Measured Values")) + xlab("Data Points") + labs(title = paste0(attribute_name)) + theme(plot.title = element_text(hjust = 0.5), legend.position = "none") graph } # 调用函数绘图 graph_builder(df, values, stage, "Test")
效果说明
修改后每个分面的x轴都会从1开始,计数到该类别的数据点总数:
- 'a'类分面x轴范围:1-20
- 'b'类分面x轴范围:1-60
- 'c'类分面x轴范围:1-120
内容的提问来源于stack exchange,提问作者Joe the Second
相关产品推荐
相关产品推荐

