在循环内使用 ggplot2 绘制直方图

Pet*_*ete 5 loops r histogram ggplot2

我想使用循环和 ggplot2 创建直方图网格。假设我有以下代码:

library(gridExtra)
library(ggplot2)

df<-matrix(NA,2000,5)
df[,1]<-rnorm(2000,1,1)
df[,2]<-rnorm(2000,2,1)
df[,3]<-rnorm(2000,3,1)
df[,4]<-rnorm(2000,4,1)
df[,5]<-rnorm(2000,5,1)
df<-data.frame(df)

out<-NULL

for (i in 1:5){

  out[[i]]<-ggplot(df, aes(x=df[,i])) + geom_histogram(binwidth=.5)

}

grid.arrange(out[[1]],out[[2]],out[[3]],out[[4]],out[[5]], ncol=2)
Run Code Online (Sandbox Code Playgroud)

请注意,所有图都出现了,但它们都具有相同的平均值和形状,尽管将 df 的每一列设置为具有不同的平均值。

它似乎只绘制了最后一个图(out[[5]]),也就是说,循环似乎正在用 out[[5]] 重新分配所有 out[[i]]。

我不确定为什么,有人可以帮忙吗?

San*_*att 5

我同意@GabrielMagno,分面是可行的方法。但是,如果由于某种原因您需要使用循环,那么其中任何一个都可以完成工作。

library(gridExtra)
library(ggplot2)

df<-matrix(NA,2000,5)
df[,1]<-rnorm(2000,1,1)
df[,2]<-rnorm(2000,2,1)
df[,3]<-rnorm(2000,3,1)
df[,4]<-rnorm(2000,4,1)
df[,5]<-rnorm(2000,5,1)
df<-data.frame(df)

out<-list()
for (i in 1:5){
   x = df[,i]
   out[[i]] <- ggplot(data.frame(x), aes(x)) + geom_histogram(binwidth=.5)
}
grid.arrange(out[[1]],out[[2]],out[[3]],out[[4]],out[[5]], ncol=2)
Run Code Online (Sandbox Code Playgroud)

或者

out1 = lapply(df, function(x){
   ggplot(data.frame(x), aes(x)) + geom_histogram(binwidth=.5) })
grid.arrange(out1[[1]],out1[[2]],out1[[3]],out1[[4]],out1[[5]], ncol=2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Gab*_*gno 3

我建议您使用facet_wrap而不是自己聚合和排列图。它要求您在数据框中指定一个分组变量,用于分隔每个分布的值。您可以使用包melt中的函数reshape2来创建此类新数据框。因此,将数据存储在 中df,您可以简单地执行以下操作:

library(ggplot2)
library(reshape2)

ggplot(melt(df), aes(x = value)) + 
    facet_wrap(~ variable, scales = "free", ncol = 2) + 
    geom_histogram(binwidth = .5)
Run Code Online (Sandbox Code Playgroud)

这会给你类似的东西:

在此输入图像描述