【问题标题】:Histograms using ggplot2 within loop在循环中使用 ggplot2 的直方图
【发布时间】:2014-02-26 00:31:45
【问题描述】:

我想使用循环和 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[[5]] 重新分配所有的 out[[i]]。

我不知道为什么,有人可以帮忙吗?

【问题讨论】:

    标签: r loops ggplot2 histogram


    【解决方案1】:

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

    library(ggplot2)
    library(reshape2)
    
    ggplot(melt(df), aes(x = value)) + 
        facet_wrap(~ variable, scales = "free", ncol = 2) + 
        geom_histogram(binwidth = .5)
    

    这会给你类似的东西:

    【讨论】:

    • 非常感谢您的有用回答!
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2020-08-11
      • 2020-06-12
      • 1970-01-01
      相关资源
      最近更新 更多