可以使用grid.arrange影响R中的绘图输出吗?

时间:2016-10-27 04:13:36

标签: r dataframe ggplot2 grid

对于接受数据框,绘图切换值和区域大小向量的函数,我试图为每个数字变量列创建每个数字变量列的图和每个数值变量列的每个密度区大小组合。绘制网格的切换值'输入。我有工作,我得到每个组合的单独的情节,但当我试图将每个数字变量的图形放在网格上时,我看到实际情节中的变化,即使据我所知,我没有& #39;改变计算或绘图命令。

例如,请注意,即使考虑到比例变化,y密度图在下图中也是不同的。试着看看grid.arrange和list的文档只是为了确保我没有遗漏某些东西,但我仍然无法弄明白。我是否以某种方式更改了绘图命令而没有意识到它?

经过测试:

data(diamonds, package = "ggplot2")
test <- diamonds[1:100,]

hstPlts(test,ps='grid') #without grid

hst1(test,ps='grid') #with grid

hstPlts <- function(df,ps = 'off',bnSize=c(30)){

#hstPlts() accepts any data frame and if the ps parameter is “on” or
#“grid”, then plot a pair of blue histograms with a vertical red line at the 
#mean
#for every numerical variable at each number of bins integer specified in  
#the bin
#vector parameter. if the plot switch is set to “grid”, there should be a
#grid for each count-bin combination and a separate grid for
#each density-bin size combination.

#parameters: 

#df : data frame

#ps : plot switch defaulted to 'off' with two additional value options -
#'on' and 'grid'

#bnSize : vector containing numeric values representing number of bins for 
histograms

num_var <- df[sapply(df,is.numeric)] #extract numeric columns

for(i in 1:length(bnSize)){ #iterate through each bin size
    for(j in 1:(ncol(num_var))){ #iterate through each numeric variable
      if(ps=='on' | ps =='grid'){ #conditional for both 'on' and 'grid' 
      #values

          bnWid <- (max(num_var[,j]) - min(num_var[,j]))/bnSize[i] # compute 
              #bin widths
          vrMn <- mean(num_var[[j]]) #compute column means for red line
          mean = sprintf("%8.3f ", vrMn) #set up label for mean line with 
              #formatted decimals
          cntPlt <- ggplot(num_var, aes(x=num_var[,j])) + #plot count   
              #histogram with numeric variable on x-axis
              geom_histogram(colour = "blue", fill = "blue", binwidth =  
              bnWid) +   
              #detail bar fill colors and histogram bin widths

              geom_vline(xintercept = mean(num_var[,j]),colour="red") + 
              #mean line 
              abs(x=colnames(num_var)[j]) #label x-axis
          densPlt <- cntPlt + aes(y = ..density..) + labs(y = "density")  
              #create corresponding density histogram 
          print(cntPlt)
          print(densPlt)
      }

      if(ps == 'grid'){ #conditional for just 'grid' value 

          grdPlt <- ggplot(num_var, aes(x=num_var[,j])) + #create plot for 
              #each count-bin combination and a separate grid for
              #each density-bin size combination
              geom_histogram(colour = "blue", fill = "blue", binwidth = 
              bnWid) +   
              #detail bar fill colors and histogram bin widths

              labs(x=colnames(num_var)[j]) #label x-axis
      print(grdPlt)
      print(grdPlt + aes(y = ..density..) + labs(y = "density")) 
      }
    }
  }
}

hstPlts plot y density

hst1 <- function(df,ps = 'off',bsizes=c(30)){

    numvar <- df[sapply(df,is.numeric)] 

    if(ps=='on')  
        for(i in 1:length(bsizes)){ 
            for(j in 1:(ncol(numvar))){ 
                bwidth <- (max(numvar[,j]) - min(numvar[,j]))/bsizes[i] 
                var_mean <- mean(numvar[[j]]) 
                mean = sprintf("%8.3f ", var_mean)
                counts <- ggplot(numvar, aes(x=numvar[,j])) + 
                    geom_histogram(colour = "blue", fill = "blue", binwidth 
                    = bwidth) + 
                    geom_vline(xintercept = mean(numvar[,j]),colour="red") +  
                    labs(x=colnames(numvar)[j]) # Labeling the x axis
                dense <- counts + aes(y = ..density..) + labs(y = "density")
                print(counts)
                print(dense)
            }
        }
    }
    else if(ps == 'grid'){
        for(i in 1:length(bsizes)){
            cntLst <- list()
            denseLst <- list()

            for(j in 1:(ncol(numvar))){
            bwidth <- (max(numvar[,j]) - min(numvar[,j]))/bsizes[i]
            cntGrPlt <- ggplot(numvar, aes(x=numvar[,j])) + 
                geom_histogram(colour = "blue", fill = "blue", binwidth = 
                bwidth) +
                labs(x=colnames(numvar)[j])
            cntLst[[length(cntLst)+1]] <- cntGrPlt
            denseLst[[j]] <- cntGrPlt + aes(y = ..density..) + labs(y = 
            "density")

            }
            grid.arrange(grobs=cntLst,ncol=2)
            grid.arrange(grobs=denseLst,ncol=2)
        }
    }
}

hst1 plot y density grid

0 个答案:

没有答案