使用facet_grid设置每列y轴限制

pcww981p  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(177)

R中,我使用ggplot2绘制了样本(准确地说是一周中的几天)中几个组的几个变量随时间变化的曲线,一个人工样本(使用适合绘制的长数据)如下所示:

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_grid(groups2 ~ groups1)

它给出了

在本例中,第一个变量(显示在左列中)具有无限范围,而第二个变量(显示在右列中)为弱正。
我想通过允许Y轴在图中的列之间不同来反映这一点,即分别为绘制的两个变量设置Y轴限值。然而,为了便于对两个变量中的每一个变量的不同组进行直观比较,我还想在每列内具有相同的Y轴。
我已经查看了facet_grid()scales选项,但它似乎不能完成我想要的任务。

  • 传递scales = "free_x"允许Y轴在各行之间变化,而
  • 传递scales = "free_y"允许X轴跨列变化,但
  • 不存在允许 * Y * 轴跨 * 列 * 变化的选项(大概也不存在跨行的X轴)。

像往常一样,我试图找到解决办法,但一无所获。非常感谢你的帮助!

j1dl9f46

j1dl9f461#

我认为最简单的方法是为每个面列创建一个图,然后用{patchwork}之类的东西绑定它们。要获得面的外观,您仍然可以添加一个面层。

library(tidyverse)
library(patchwork)

groups1 <- rep(1:2, each = 7 * 100)
groups2 <- rep(rep(1:7, times = 2), each = 100)
x <- rep(1:100, times = 14)
set.seed(42) ## always better to set a seed before using random functions
values <- c(rnorm(n = 700), rgamma(n = 700, shape = 2))

data <- tibble(x, groups1, groups2, values)
data %>%
  group_split(groups1) %>%
  map({
    ~ggplot(.x, aes(x = x, y = values)) +
  geom_line() + 
  facet_grid(groups2 ~ groups1)
  }) %>%
  wrap_plots()

创建于2023年1月11日,使用reprex v2.0.2

相关问题