迭代地在地图函数中应用ggplot函数

时间:2017-10-04 17:16:58

标签: r ggplot2 tidyverse purrr

我想为数据集中的所有变量生成一系列直方图,但我显然没有正确地准备数据以用于map函数。

library(tidyverse)

mtcars %>% 
  select(wt, disp, hp) %>% 
  map(., function(x)
    ggplot(aes(x = x)) + geom_histogram()
)

我可以使用for循环完成此任务(h / t但是我试图在tidyverse中做同样的事情。

foo <- function(df) {
  nm <- names(df)
  for (i in seq_along(nm)) {
print(
  ggplot(df, aes_string(x = nm[i])) + 
  geom_histogram()) 
  }
}

mtcars %>% 
  select(wt, disp, hp) %>% 
  foo(.)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

这样的事情也可行:

library(purrr)
library(dplyr)
mtcars %>% 
  select(wt, disp, hp) %>% 
  names() %>%
  map(~ggplot(mtcars, aes_string(x = .)) + geom_histogram())

或:

mtcars %>% 
  select(wt, disp, hp) %>% 
  {map2(list(.), names(.), ~ ggplot(.x, aes_string(x = .y)) + geom_histogram())}

答案 1 :(得分:2)

要使用purrr::map,您可以融化数据框,然后根据变量名称将其拆分为数据框列表

library(reshape2)
library(dplyr)
library(ggplot2)
library(purrr)

melt(mtcars) %>%
  split(.$variable) %>%
  map(., ~ggplot(.x, aes(x=value)) + 
            geom_histogram())

您也可以使用ggplot2::facet_wrap一次性绘制所有内容

library(reshape2)
library(dplyr)
library(ggplot2)

melt(mtcars) %>% 
  ggplot(., aes(x=value, label=variable)) + 
  geom_histogram() + 
  facet_wrap(~variable, nrow=ncol(mtcars))