我想为数据框中的所有变量生成一个boxplot。但问题是我不能让x轴标记为通过lapply循环的变量名。任何想法。
df=data.frame(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(1:2,50)) # data
df$d=as.factor(df$d)
箱形图的功能
Boxplotfun=function(x,i){
if(is.numeric(x)) {
p <- ggplot(df, aes(d, x, group=d)) + geom_boxplot(outlier.colour = "red", fill = c("gold","darkgreen")) + coord_flip() + theme_light() + ggtitle(paste(names(x)))
plot(p)
}
}
l=lapply(df[-ncol(df)], Boxplotfun)
答案 0 :(得分:2)
只是让理查德的评论回答:
df <- data.frame(a=rnorm(100), b=rnorm(100), c=rnorm(100), d=rep(1:2,50)) # data
df$d <- as.factor(df$d)
df2 <- tidyr::gather(df, 'var', 'val', -d)
ggplot(df2, aes(d, val, fill = d)) +
geom_boxplot(outlier.colour = "red") +
scale_fill_manual(values = c("gold","darkgreen")) +
coord_flip() +
theme_light() +
facet_grid(var~.)
答案 1 :(得分:1)
您可以直接使用数据框的名称,而不是使用数据框作为lapply的第一个参数,而只是引用绘图函数中的数据框。
我没有使用过aes,而是使用了aes_string,这样我就可以传递&#34; x&#34; inside和ggplot理解我不是在寻找变量x,而是寻找名称为&#34; x&#34;的变量。指
Boxplotfun=function(x) {
if(is.numeric(df[, x])) {
p <- ggplot(df, aes_string("d", x, group="d")) +
geom_boxplot(outlier.colour = "red", fill = c("gold","darkgreen")) +
coord_flip() + theme_light() +
ggtitle(x)
plot(p)
}
}
ll <- lapply(names(df[-ncol(df)]), Boxplotfun)
修改强> 如果你想要显示图例,你应该像Axeman的答案所示,在你的内部指定填充并使用scale_fill_manual来选择颜色:
Boxplotfun=function(x) {
if(is.numeric(df[, x])) {
p <- ggplot(df, aes_string("d", x, fill="d")) +
geom_boxplot(outlier.colour = "red")+
scale_fill_manual(values = c("gold","darkgreen")) +
coord_flip() + theme_light() +
ggtitle(x)
plot(p)
}
}