如何在绘图中访问lapply函数中元素的名称

时间:2016-07-01 07:32:42

标签: r ggplot2 lapply

我想为数据框中的所有变量生成一个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)

2 个答案:

答案 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~.)

enter image description here

答案 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)
  } 
}