我想使用循环和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)
请注意,尽管已将每个df列设置为具有不同的平均值,但所有绘图都会出现,但它们都具有相同的均值和形状。
似乎只绘制了最后一个图(out [[5]]),也就是说,循环似乎是将所有out [[i]] s重新分配[[5]]。
我不确定为什么,有人可以帮忙吗?
答案 0 :(得分: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)
这会给你类似的东西:
答案 1 :(得分:2)
我同意@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)
或
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)