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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:30:44