理解cowplotplot_grid中重复的图

问题描述 投票:0回答:1

我需要进行健全性检查。我很难理解为什么我的代码中 N 个图的plot_grid (cowplot) 的结果会生成 N 个相同的图。从我提供的列表中,我取出了每个数据框来验证每个图应该不同,但是,当我将完整列表传递给plot_grid时,它们看起来都相同。

p <- vector("list",length(dataList))
for(i in 1:length(dataList)) {
  df <- dataList[[i]]
  p[[i]] <- ggplot(df, aes(df$base)) + geom_bar()
}

multi <- plot_grid(plotlist=p, align="hv")

save_plot(paste("data_freqs.tiff",sep=""), multi, dpi=300, base_aspect_ratio=1.5)

例如,当输入以下内容时,我可以看到数据不同:

a<-dataList[[1]]
b<-dataList[[2]]
sum(a$base=="T")
>1245
sum(b$base=="T")
>1034

但是,我最终得到了多个具有相同 T 值的图(全部固定为 1245)。

r
1个回答
0
投票

解决方案:

尝试将

aes(df$base)
更改为
aes(base)
,如:

  p[[i]] <- ggplot(df, aes(base)) + geom_bar()

说明:

ggplot 对象存储数据帧的副本(参见

p[[1]]$data
),但仅将美学存储为未评估的公式:

> p[[1]]$mapping
Aesthetic mapping: 
* `x` -> `df$base`
> class(p[[1]]$mapping)
[1] "uneval" 

Ggplot 直到最后一刻才创建实际的绘图(在这种情况下,当调用“plot_grid”时)。此时,ggplot 在环境中搜索“df$base”变量长度(dataList)次。因为它在 for 循环完成后就已经这样做了,所以每次都会找到相同的精确向量。

工作示例:

dataList = list()
for( i in 1:3 ){
  prob = c(.1*i,.6 - .1*i,.3)
  base = sample(1:3, 50, replace=T, prob = prob)
  dataList[[i]] = data.frame( base = base )
}

p <- vector("list",length(dataList))
for(i in 1:length(dataList)) {
  df <- dataList[[i]]
  p[[i]] <- ggplot(df, aes(base)) + geom_bar()
}

plot_grid(plotlist=p, align="hv")
© www.soinside.com 2019 - 2024. All rights reserved.