使用facet_grid为ggplot2分栏设置独立Y轴范围
解决ggplot2中facet_grid按列设置独立Y轴范围的需求
方法1:使用ggh4x包的facet_grid2(推荐)
ggh4x是ggplot2的扩展包,专门解决这类facet的进阶需求,其中facet_grid2支持按列/行单独设置自由轴。
先安装并加载包:
install.packages("ggh4x") library(ggh4x)
修改绘图代码,把facet_grid替换为facet_grid2,指定scales = list(y = "free_col")即可实现Y轴按列独立调整,同列内子图Y轴保持一致:
library(tidyverse) # 生成示例数据 groups1 <- rep(1:2, each = 7 * 100) groups2 <- rep(rep(1:7, times = 2), each = 100) x <- rep(1:100, times = 14) values <- c(rnorm(n = 700), rgamma(n = 700, shape = 2)) data <- tibble(x, groups1, groups2, values) # 绘制目标图形 data %>% ggplot(mapping = aes(x = x, y = values)) + geom_line() + facet_grid2(groups2 ~ groups1, scales = list(y = "free_col"))
方法2:手动拆分数据+patchwork拼接(无需额外包)
如果不想安装扩展包,可按groups1拆分数据,分别绘制每列子图后用patchwork拼接,同样能实现列间Y轴独立、列内Y轴统一的效果。
先安装并加载patchwork:
install.packages("patchwork") library(patchwork)
拆分数据并绘图拼接:
# 按groups1拆分数据 data_col1 <- data %>% filter(groups1 == 1) data_col2 <- data %>% filter(groups1 == 2) # 绘制左列子图 p1 <- data_col1 %>% ggplot(aes(x = x, y = values)) + geom_line() + facet_grid(groups2 ~ .) + labs(title = "groups1 = 1") # 绘制右列子图 p2 <- data_col2 %>% ggplot(aes(x = x, y = values)) + geom_line() + facet_grid(groups2 ~ .) + labs(title = "groups1 = 2") # 拼接两列图形 p1 + p2 + plot_layout(ncol = 2)
以上两种方法都能满足你的需求:列之间Y轴范围独立,同列内子图Y轴保持一致,方便同列组间对比。
内容的提问来源于stack exchange,提问作者BestGirl
相关产品推荐
相关产品推荐

