使用facet_wrap在3行中设置通用y轴值

问题描述

我已经用facet_wrap创建了一个月度图

enter image description here

因此在图中,我有3行4列。现在,我想为每行设置通用的y轴,例如,第一行应具有一个通用的y值,第二行和第三行也应如此。

我尝试了但无法做到。

我用过

ggplot(data = PB,aes(x = new_date,y = Mean,group = 1)) +         
  geom_line(aes(color = experiment)) +                        
  theme(legend.title = element_blank()) + 
  facet_wrap( ~MonthAbb,ncol = 4,scales = "free")

解决方法

问题是scales = "free"。删除它,它将在行和列之间设置一个通用比例(或使用"free_y""free_x"进行相应调整)。

如果您要查找的是每行一个单独的比例尺,则将需要更多的工作。在R: How do I use coord_cartesian on facet_grid with free-ranging axis处检查该解决方案,该解决方案在绘图上分层不可见点以强制显示所需的外观。否则,一个简单的解决方案可能是使用gridExtra查看并分别绘制每行,然后合并到网格中。

编辑:gridExtra解决方案类似于:

library(gridExtra)

g1 <- ggplot(data = PB1,aes(x=new_date,y = Mean,group = 1)) +
    geom_line(aes(color = experiment)) + 
    theme(legend.title = element_blank())
g2 <- ggplot(data = PB2,group = 1)) +
    geom_line(aes(color = experiment)) + 
    theme(legend.title = element_blank())

grid.arrange(g1,g2,nrow=2)
,

这里是一个根据每个面板进行设置的选项。它基于我放在github包中的函数。我以一些虚拟数据为例。

library(ggplot2)
library(ggh4x) # devtools::install_github("teunbrand/ggh4x")

df <- data.frame(
  x = rep(1:20,9),y = c(cumsum(rnorm(60)) + 90,cumsum(rnorm(60)) - 90,cumsum(rnorm(60))),row = rep(LETTERS[1:3],each = 60),col = rep(LETTERS[1:3],each = 20)
)

ggplot(df,aes(x,y)) +
  geom_line() +
  facet_wrap(row ~ col,scales = "free_y") +
  facetted_pos_scales(
    y = rep(list(
      scale_y_continuous(limits = c(90,100)),scale_y_continuous(limits = c(-100,-80)),scale_y_continuous(limits = c(0,20))
    ),each = 3)
  )

enter image description here