如何从嵌套列表中提取每个ggplot2图

bsc*_*idr 6 r ggplot2

制作大型嵌套列表以跟踪使用创建的图通常很方便ggplot2

例如,这是我如何在大量的图列表中存储少量图,以及主题和子主题的子列表。

summary_plots

  1. $Demographics
    • Demographics$Socioeconomic$Household_Income_Plot
    • Demographics$Socioeconomic$Education_Plot
    • Demographics$Age_Plot
  2. $Product_Usage
    • Purchase_Frequency_Plot
    • ....

如何ggplot2从整个列表中提取所有绘图对象?我希望能够创建一个“平面”的单层列表,其中包含原始列表中包含的所有图。


这是一个简单的示例列表:

generic_plot <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg)) 

summary_plots <- list() 
summary_plots$Demographics$Socioeconomic$Income <- generic_plot 
summary_plots$Demographics$Socioeconomic$Education <- generic_plot 
summary_plots$Demographics$Age <- generic_plot 
summary_plots$Product_Usage$Purchase_Frequency <- generic_plot
Run Code Online (Sandbox Code Playgroud)

所需的结果将等同于创建一个如下所示的列表:

list('Demographics.Socioeconomic.Income' = generic_plot,
     'Demographics.Socioeconomic.Education' = generic_plot,
     ...)
Run Code Online (Sandbox Code Playgroud)

div*_*san 6

在写这个答案的代码@迈克尔会做到这一点,有一个小的修改。

如果我们改变了class在检查 morelists <- ...线路只有拉平如果类包含'list'包含类'gg',那么就不会压平的地块,并返回ggplots的平面列表。

flattenlist <- function(x){  
    morelists <- sapply(x, function(xprime) {
        'list' %in% class(xprime) & !('gg' %in% class(xprime))
    })
    out <- c(x[!morelists], unlist(x[morelists], recursive=FALSE))
    if(sum(morelists)){ 
        Recall(out)
    }else{
        return(out)
    }
}


plts <- flattenlist(summary_plots)

names(plts)

[1] "Demographics.Age"                    
[2] "Product_Usage.Purchase_Frequency"    
[3] "Demographics.Socioeconomic.Income"   
[4] "Demographics.Socioeconomic.Education"


lapply(plts, class)

$Demographics.Age
[1] "gg"     "ggplot"

$Product_Usage.Purchase_Frequency
[1] "gg"     "ggplot"

$Demographics.Socioeconomic.Income
[1] "gg"     "ggplot"

$Demographics.Socioeconomic.Education
[1] "gg"     "ggplot"
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用R多年了,却从未听说过`Recall()`。很好的用例,我遇到了尝试解决此问题的问题,因为显然“ list.flatten(summary_plots,classes =“ ggplot”)`什么都不做,而`list.flatten(summary_plots,classes =“ gg”)`会产生错误的结果(返回子`ggplot`对象)。该函数看似仅查看对象的第一类。 (3认同)
  • 谢谢@divibisan提供的答案。我已将其调整为Roxygen2文档的功能,因此可以将其整齐地合并到R包中。任何人都可以在这里使用它:https://gist.github.com/bschneidr/3f9862b8856f87d2b8f8a24878f76cc9 (3认同)