所以我有一个数据框,设置有点像这样:
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()
谢谢!
答案 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
如您所见,当您有太多分组变量时,这是不可行的。
方法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()
})