R ggplot2将绘图保存为R对象并以网格显示

在下面的可重现示例中,我尝试为ggplot分布图创建函数并将其保存为R对象,目的是在网格中显示两个图。

ggplothist<- function(dat,var1)
{
        if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    output<-list(distribution,var1,dat)
    return(output)
}

呼吁功能:

set.seed(100)
df  <- data.frame(x = rnorm(100, mean=10),y =rep(1,100))    
output1 <- ggplothist(dat=df,var1='x')
output1[1]

一切都好,直到现在。

然后我想做第二个情节,(注意平均值= 100而不是之前的10)

df2  <- data.frame(x = rep(1,1000),y = rnorm(1000, mean=100))    
output2 <- ggplothist(dat=df2,var1='y')
output2[1]

然后我尝试用均值10重新绘制第一个分布。

output1[1]

我得到和以前一样的分配? 但是,如果我使用函数中包含的信息,请将其返回并将其重置为全局变量。

var1=as.numeric(output1[2]);dat=as.data.frame(output1[3]);p1 <- output1[1]
p1

如果有人能解释为什么会发生这种情况,我想知道。 看起来,为了绘制预期的分布,我必须将data.frame和variable重置为绘制图的内容。 有没有办法将剧情保存为一个对象而不必这样做。 幸运的是,我可以重新绘制第一个发行版。

但是我不能同时对他们进行绘图

 var1=as.numeric(output2[2]);dat=as.data.frame(output2[3]);p2 <- output2[1]
 grid.arrange(p1,p2)

错误:gList中的错误(列表(列表(数据=列表(x = c(9.66707664902549,11.3631137069225,仅在'gList'中允许的'grobs'

在这个“已在for循环中创建的多个ggplot2图的网格”回答中,建议使用列表来包含图

 ggplothist<- function(dat,var1)
{
    if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    plot(distribution)
    pltlist <- list()
    pltlist[["plot"]] <- distribution
    output<-list(pltlist,var1,dat)
    return(output)
}

output1 <- ggplothist(dat=df,var1='x')
p1<-output1[1]

output2 <- ggplothist(dat=df2,var1='y')
p2<-output2[1]

output1[1]

将再次产生均值= 100的分布而不是均值= 10,并且:

grid.arrange(p1,p2)

会产生相同的错误

gList中的错误(list(list(plot = list(data = list(x = c(9.66707664902549,:only'grobs'allowed in“gList”

作为最后一次尝试,我尝试使用recordPlot()将关于绘图的所有内容记录到对象中。 以下是现在的功能。

    ggplothist<- function(dat,var1)
{
    if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    plot(distribution)
    distribution<-recordPlot()
    output<-list(distribution,var1,dat)
    return(output)
}

该函数将产生与以前相同的错误,具体取决于重置dat,以及var1变量与绘制分布所需的变量。 同样不能放入网格中。

我在这个问题中尝试了类似的东西像arrangeGrob()“R将多个ggplot2图作为R对象保存在列表中,并在网格中重新显示”但没有运气。

我真的很喜欢这样一种解决方案,它创建一个包含图的R对象,该对象可以自行重绘,并且可以在网格中使用,而不必在每次完成时重置用于绘制图的变量。 我也想知道这是怎么回事,因为我根本不认为它很直观。

我能想到的唯一解决方案是将绘图绘制为png文件,保存在某个地方,然后让该函数返回路径,以便我可以重用 - 是其他人在做什么?

感谢您的阅读,并为长期的问题感到抱歉。


找到了解决方案

如何在R中引用函数中的本地环境?

通过插入

localenv <- environment() 

并在ggplot中引用它

distribution <- ggplot(data=dat, aes(dat[,var1]),environment = localenv)

这一切都工作! 即使有网格布置!

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

上一篇: R ggplot2 saving plots as R objects and displaying in grid

下一篇: Saving a graph with ggsave after using ggplot