在下面的可重现示例中,我尝试为 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 和变量重置为用于绘制绘图的内容。有没有办法将绘图保存为对象而不必这样做。幸运的是我可以重新绘制第一个分布。
但我不能同时绘制它们
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”中只允许使用“grob”
在这个“在 for 循环中绘制的多个 ggplot2 绘图的网格 https://stackoverflow.com/questions/9315611/grid-of-multiple-ggplot2-plots-which-have-been-made-in-a-for-loop“建议使用列表来包含绘图的答案
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(列表(列表(plot =列表(数据=列表(x = c(9.66707664902549,,:
“gList”中只允许使用“grob”
作为最后一次尝试,我尝试使用 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对象并在网格中重新显示 https://stackoverflow.com/questions/31947727/r-saving-multiple-ggplot2-plots-as-r-object-in-list-and-re-displaying-in-grid“但运气不佳。
我真的很想要一个解决方案,它创建一个包含绘图的 R 对象,该对象可以自行重绘,并且可以在网格内使用,而无需在每次完成时重置用于绘制绘图的变量。我也想了解这是怎么回事,因为我认为它根本不直观。
我能想到的唯一解决方案是将绘图绘制为 png 文件,保存在某处,然后让函数返回路径,以便我可以重用 - 这是其他人正在做的事情吗?
感谢您的阅读,很抱歉问了这么长的问题。