R:将ggplot2图保存在列表中

我正在编写一个R代码,允许用户从数据中选择列并绘制每个列的直方图。 因此,我使用'for'循环来使用ggplot2库生成所需数量的图并将它们保存在单个列表中。 但是我面临的问题是,在'for'循环的每一次迭代中,列表中的所有对象都存储相同的图。 因此,最终输出由直方图的网格组成,标记不同,但描绘了相同(最后一个)列。

我知道这个问题已经很老了,我找到了在for循环中重命名ggplot2图的答案,并且https://stat.ethz.ch/pipermail/r-help/2008-February/154438.html是一个有用的开始点。

我使用R中的标准Swiss Fertility数据集来生成图。 这是代码: -

data_ <- swiss
data_ <- na.omit(data_)

u <- c(2, 3, 4, 5, 6)
plotData <- data_[,u]
bw <- 5
plotType <- 'probability'

library(ggplot2)
library(gridExtra)

histogramList <- vector('list', length(u))

if(plotType=='probability')
{
 for(i in 1:length(u))
 {
   indexDataFrame <- data.frame(plotData[,i])
   probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1]))
   histogramList[[i]] <-  probabilityHistogram + geom_histogram(aes(y=..density..),     binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none')
 }
} else
if(plotType=='frequency')
{
 for(i in 1:length(u))
 {
   indexDataFrame <- data.frame(plotData[,i])
   probabilityHistogram <- ggplot(indexDataFrame, aes(x=indexDataFrame[,1]))
   histogramList[[i]] <- probabilityHistogram + geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none')
 }
}

arg_list <- c(histogramList, list(nrow=3, ncol=2))
#jpeg('histogram', width=1024, height=968)
do.call(grid.arrange, arg_list)
#graphics.off()

如果我在本论坛中错过了对该问题的明显回答,我很抱歉,如果能够指导我这个问题,我将不胜感激。 我希望我的解释清楚,如果没有,请让我知道所需的澄清。

谢谢!


您可以通过以下方式大大简化您的代码:

  • 使用方面,而不是手动排列多个图
  • 将函数melt到包reshape2将数据melt
  • 这意味着你可以删除循环
  • 这是一个完整的代码重写,没有看到任何循环。

    data_ <- swiss
    data_ <- na.omit(data_)
    
    u <- c(2, 3, 4, 5, 6)
    plotData <- data_[,u]
    bw <- 5
    plotType <- 'frequency'
    
    library(ggplot2)
    library(reshape2)
    
    mdat <- melt(plotData)
    
    if(plotType=='probability'){
      ph <- ggplot(mdat, aes(value)) +
        geom_histogram(aes(y=..density..), binwidth=bw, colour='black', fill='skyblue') + 
        geom_density() + 
        facet_wrap(~variable, scales="free")
    } 
    
    if(plotType=='frequency'){
      ph <- ggplot(mdat, aes(value)) +
        geom_histogram(aes(y=..count..), binwidth=bw, colour='black', fill='skyblue') + 
        geom_density() + 
        facet_wrap(~variable, scales="free")
    }
    
    print(ph)
    

    由此产生的图形:

    可能性:

    频率


    而不是使用aes来映射美学,您最好使用aes_string

     for(i in 1:length(u))
     {
       probabilityHistogram <- ggplot(plotData, aes_string(x=names(plotData)[i]))
       histogramList[[i]] <-  probabilityHistogram + geom_histogram(aes(y=..density..),     binwidth=bw, colour='black', fill='skyblue') + geom_density() + scale_x_continuous(names(plotData)[i]) + opts(legend.position='none')
     }
    

    至少,这对我来说很有效。 这样可以避免必须对数据进行子集划分,并允许您通过引用的名称引用要绘制的列。

    链接地址: http://www.djcxy.com/p/5215.html

    上一篇: R: saving ggplot2 plots in a list

    下一篇: Plot two graphs in same plot in R