循环为数据框中的变量生成图
loop generate plots for variables in a data frame
所以我有一个数据框,设置有点像这样:
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()
谢谢!
这里有几种适合您的方法。我猜有一个重复项,但如果您刚刚开始,将这些答案应用到您的数据并不总是那么容易。
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:每个变量不同 plots/images,仍然使用长数据。我按变量拆分了长数据,并为每个块创建了一个图。当前代码绘制到控制台;文件保存代码被注释掉了。
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()
})
所以我有一个数据框,设置有点像这样:
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()
谢谢!
这里有几种适合您的方法。我猜有一个重复项,但如果您刚刚开始,将这些答案应用到您的数据并不总是那么容易。
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:每个变量不同 plots/images,仍然使用长数据。我按变量拆分了长数据,并为每个块创建了一个图。当前代码绘制到控制台;文件保存代码被注释掉了。
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()
})