如何让ggh4x::facet_grid2()每行x轴独立且列间刻度范围一致?
解决方案
要实现每行内的两列分面使用相同的X轴范围,且不同行之间X轴范围独立,你可以借助ggh4x包的facetted_pos_scales()函数,手动为每个行(Species)设置统一的X轴范围。以下是具体实现步骤:
步骤1:预计算每行的X轴范围
根据你的理想效果,先为每个Species定义对应的X轴上下限:
library(tidyverse) library(ggh4x) # 生成示例数据 iris <- iris %>% mutate(group1 = rep(c("w","x","y","z"), each=20, length.out=nrow(iris)), group2 = rep(c("A","B"), length.out=nrow(iris))) # 定义每行的X轴范围(按Species分组) x_limits <- list( setosa = c(4.4, 5.6), versicolor = c(5, 7), virginica = c(5, 8) )
步骤2:为每个分面创建自定义X轴刻度
根据Species和group2的组合,生成每个分面对应的X轴刻度设置,确保同一Species的分面使用相同的X轴范围:
# 生成每个分面的X轴刻度列表 scales_list <- crossing(Species = unique(iris$Species), group2 = unique(iris$group2)) %>% mutate(scale = map(Species, ~ scale_x_continuous(limits = x_limits[[.x]]))) %>% deframe() %>% as.list()
步骤3:绘制图形并应用自定义刻度
使用facet_grid2()保持Y轴自由缩放,同时通过facetted_pos_scales()应用预定义的X轴范围:
ggplot(iris, aes(x=Sepal.Length, y=group1)) + geom_point() + facet_grid2(Species~group2, scales = "free") + # Y轴自由缩放 facetted_pos_scales(scales = scales_list) # 应用每行统一的X轴范围
原理说明
- 移除
independent="x"参数,避免每个分面独立设置X轴。 - 通过
facetted_pos_scales()为每个分面指定X轴范围,同一行(Species)的分面共享相同的上下限,不同行则使用各自独立的范围。 scales="free"保证Y轴仍能根据每个分面的内容自由调整。
内容的提问来源于stack exchange,提问作者mk123
相关产品推荐
相关产品推荐

