如何存储ggplots列表以在多时隙中使用而不覆盖以前的图?

时间:2013-12-23 03:11:35

标签: arrays r list ggplot2

我想使用从另一个函数(下面的cd参数)创建的对象在多时隙中绘制协方差/相关矩阵的一些热图。协方差矩阵存储在3维数组中,因此cd$covmat[,,i]调用第i个协方差矩阵。

最初我遇到了一些与复制相同情节有关的问题。但是,我发现我遇到了环境问题。我已尝试解决这几种方法,下面的代码是最新的,但我无法弄清楚为什么它没有正确阅读。

这有什么特别的原因吗?我已经尝试包含和排除环境参数(我希望不需要),我已经尝试直接使用cd$covmat[,,i] aes()参数。

drawCovs<-function(cd,ncols){
    require(ggplot2)
    coords=expand.grid(x=1:cd$q,y=1:cd$q)
    climits = c(-1,1)*max(cd$covmat)
    cd$levels=c(cd$levels,"Total")
    covtext=ifelse(!(cd$use.cor),'Covariance','Correlation')
    plots=list()
    cmat=list()
    for (i in 1:(nlevels+1)){
        cmat[[i]]<-cd$covmat[,,i]
        .e<-environment
        plots[[i]]<-ggplot(environment=.e)+geom_tile(aes(x=coords$x,y=coords$y,
        fill=as.numeric(cmat[[i]]),color='white'))+
        scale_fill_gradient(covtext,low='darkblue',high='red',limits=climits)+ylab('')
        +xlab('')+guides(color='none')+scale_x_discrete(labels=cd$varnames,
        limits=1:cd$q, expand=c(0,0))+scale_y_discrete(labels=cd$varnames,
        limits=1:cd$q, expand=c(0,0))+theme(axis.text.x = element_text(angle = 90,
        hjust = 1))+labs(title=paste0(covtext,"s of data, ",cd$levels[i]))
    }

    multiplot(plotlist=plots,cols=ncols)
}

1 个答案:

答案 0 :(得分:6)

如果您最终尝试通过直接调用环境来修复问题,则可能会使代码过于复杂。这是一个简单的代码片段,可以作为您的函数的核心:

drawCovs <- function(cd, ncols) {
  require(ggplot2)
  require(reshape2)
  plots=list()
  cmat=list()
  for (i in 1:(length(cd$covmat))) {
    cmat[[i]] <- cd$covmat[[i]]
    plots[[i]] <- ggplot(melt(cmat), aes(x=Var1, y=Var2, fill=value)) + 
                  geom_tile(color='white')
  }  
  multiplot(plotlist=plots,cols=ncols)
}

cd <- list()
cd$covmat <- list(matrix(runif(25), 5), matrix(runif(25), 5))

drawCovs(cd, 1)

enter image description here