循环生成数据框中变量的图

时间:2015-11-13 09:08:24

标签: r loops ggplot2 boxplot

所以我有一个数据框,设置有点像这样:

Sample V1  V2 V3  Group1 Group2
bob    12  32  12  G1      G2
susan  43  23  54  G2      G2
mary   23  65  34  G1      G2

我能够分别对每个变量(V1,V2,V3)进行分组的箱形图,按Group1和Group2变量分组,但是我的真实数据集有更多的变量,并且单独编码会很繁琐。有没有办法可以循环这个过程,并自动生成和生成图表? For循环对我来说仍然是一个不起眼的主题。

以下是我用来生成单个图的代码:

png(filename= "filename.jpg")
ggplot(aes(y=data$V1, x=data$Group1, fill=data$Group2), data=data) + geomboxplot()
dev.off()

谢谢!

1 个答案:

答案 0 :(得分:3)

以下是几种方法。我猜测有重复,但如果您刚刚开始,那么将这些答案应用于您的数据并不总是那么容易。

library(reshape2)
library(ggplot2)
###create some data
set.seed(100)
n = 500

dat <- data.frame(sample = sample(LETTERS[1:10],n,T),
                  V1 = sample(50,n,T),
                  V2 = sample(50,n,T),
                  V3 = sample(50,n,T),
                  Group1 = paste0("G",sample(3,n,T)),
                  Group2 = paste0("G",sample(5,n,T)))

方法1:融化和刻面

dat_m <- melt(dat,measure.vars = c("V1","V2","V3"))

p1 <- ggplot(dat_m, aes(x = Group1,y = value,fill = Group2))+
  geom_boxplot() + facet_wrap(~variable)
p1

enter image description here

如您所见,当您有太多分组变量时,这是不可行的。

方法2:每个变量的不同图/图像,仍然使用长数据。我按变量拆分了长数据,并为每个块创建了一个图。当前代码绘制到控制台;文件保存代码已注释掉。

lapply(split(dat_m, dat_m$variable), function(chunk){
  myfilename <- sprintf("plot_%s.png", unique(chunk$variable))

  p <- ggplot(chunk, aes(x = Group1,y = value,fill = Group2)) +
    geom_boxplot() + labs(title = myfilename)
  p
#   #png(filename = myfilename)
#   print(p)
#   dev.off()

})

第三种方法是使用您感兴趣的列字符串:

#vector of columns you want to plot
mycols <- c("V1","V2","V3")

#plotting for each column. Not that I've put the 'fixed' variable
#inside aes in the main call to ggplot, and the 'varying' variable
#inside aes_string in the call to boxplot

lapply(mycols, function(cc){
  myfilename <- sprintf("plot_%s.png",cc)
  p <- ggplot(dat, aes(x = Group1,fill = Group2)) +
    geom_boxplot(aes_string(y = cc)) + labs(title = myfilename)
  p
  #   #png(filename = myfilename)
  #   print(p)
  #   dev.off()
})