巨大的小平面粉丝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
我们按照以下步骤构建函数:
'z').facet空ggplot对象中的一个覆盖我们的绘图对象的元素(所以如果我们在这个阶段打印它,方面就会消失).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)

虽然我正在为此寻找解决方案,但我可以跨越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)
这是你需要的东西吗?它对我有用.