将平面图分割成图表列表

Ben*_*Ben 16 r ggplot2

巨大的小平面粉丝ggplot2.但是,有时我会有太多的子图,将它们分成一个图表列表会很好.例如

df <- data.frame(x=seq(1,24,1), y=seq(1,24,1), z=rep(seq(1,12),each=2))
df
    x  y  z
1   1  1  1
2   2  2  1
3   3  3  2
4   4  4  2
5   5  5  3
.   .  .  .
.   .  .  .

myplot <- ggplot(df,aes(x=x, y=y))+geom_point()+facet_wrap(~z)
myplot
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我如何编写一个函数来获取结果图并将其拆分成一个图表列表?沿着这些方向的东西

splitFacet <- function(subsPerPlot){
  # Method to break a single facet plot into a list of facet plots, each with at most `subsPerPlot` subplots

  # code...

  return(listOfPlots)
}
Run Code Online (Sandbox Code Playgroud)

Moo*_*per 14

将图分成单个图

我们按照以下步骤构建函数​​:

  1. 我们遍历对象的结构以获取用于分面的变量的名称(这里'z').
  2. 我们用facetggplot对象中的一个覆盖我们的绘图对象的元素(所以如果我们在这个阶段打印它,方面就会消失).
  3. 我们提取数据并将其与我们在第一步中确定的变量分开.
  4. 我们用每个子集覆盖原始数据(12这里是时间)并将所有输出存储在列表中.

splitFacet <- function(x){
  facet_vars <- names(x$facet$params$facets)         # 1
  x$facet    <- ggplot2::ggplot()$facet              # 2
  datasets   <- split(x$data, x$data[facet_vars])    # 3
  new_plots  <- lapply(datasets,function(new_data) { # 4
    x$data <- new_data
    x})
}    

new_plots <- splitFacet(myplot)
length(new_plots) # [1] 12
new_plots[[3]]    # 3rd plot
Run Code Online (Sandbox Code Playgroud)


将绘图分割成多个n子图的刻面图

如果我们想要保持方面但是通过方面具有较少的绘图,我们可以跳过步骤2,并重新修改我们的分割,因此它包括用于分面的变量的若干值.

我们将概括第一个,而不是制作一个单独的函数,而是n通过绘图得到的方面数量.

n = NULL意味着您获得了先前的输出,这与n = 1(绘图的一个方面)略有不同.

splitFacet <- function(x, n = NULL){
  facet_vars <- names(x$facet$params$facets)               # 1
  if(is.null(n)){
    x$facet  <- ggplot2::ggplot()$facet                    # 2a
    datasets <- split(x$data, x$data[facet_vars])          # 3a
  } else {
    inter0 <- interaction(x$data[facet_vars], drop = TRUE) # 2b
    inter  <- ceiling(as.numeric(inter0)/n)
    datasets <- split(x$data, inter)                       # 3b
  }
  new_plots  <- lapply(datasets,function(new_data) {       # 4
    x$data <- new_data
    x})
} 

new_plots2 <- splitFacet(myplot,4)
length(new_plots2) # [1] 3
new_plots2[[2]]    
Run Code Online (Sandbox Code Playgroud)


这也可能派上用场:

unfacet <- function(x){
  x$facet <- ggplot2::ggplot()$facet
  x
}
Run Code Online (Sandbox Code Playgroud)

整洁的方式

如果代码可用,不需要经历所有这些麻烦,我们可以在将数据提供给之前拆分数据ggplot:

library(tidyverse)
myplots3 <-
  df %>% 
  split(ceiling(group_indices(.,z)/n_facets)) %>% 
  map(~ggplot(.,aes(x =x, y=y))+geom_point()+facet_wrap(~z))

myplots3[[3]]
Run Code Online (Sandbox Code Playgroud)


Pet*_*900 5

虽然我正在为此寻找解决方案,但我可以跨越ggplus.具体功能facet_multiple:

https://github.com/guiastrennec/ggplus

它允许您通过指定每页所需的绘图量来分割多个页面上的构面.在您的示例中,它将是:

library(ggplus)

df <- data.frame(x=seq(1,24,1), y=seq(1,24,1), z=rep(seq(1,12),each=2))

myplot <- ggplot(df,aes(x=x, y=y))+geom_point()

facet_multiple(plot = myplot, facets = 'z', ncol = 2, nrow = 2)
Run Code Online (Sandbox Code Playgroud)

这是你需要的东西吗?它对我有用.