Apply a ggplot-function per group with dplyr and s

2019-01-08 23:18发布

I would like to create one separate plot per group in a data frame and include the group in the title.

With the iris dataset I can in base R and ggplot do this

plots1 <- lapply(split(iris, iris$Species), 
  function(x) 
    ggplot(x, aes(x=Petal.Width, y=Petal.Length)) +
      geom_point() +
      ggtitle(x$Species[1]))

Is there an equivalent using dplyr?

Here's an attempt using facets instead of title.

p <- ggplot(data=iris, aes(x=Petal.Width, y=Petal.Length)) + geom_point()
plots2 = iris %>% group_by(Species) %>% do(plots = p %+% . + facet_wrap(~Species))

where I use %+% to replace the dataset in p with the subset for each call.

Workaround with facets

or (working but complex) with ggtitle

plots3 = iris %>%
  group_by(Species) %>%
  do(
    plots = ggplot(data=.) +
      geom_point(aes(x=Petal.Width, y=Petal.Length)) +
      ggtitle(. %>% select(Species) %>% mutate(Species=as.character(Species)) %>% head(1) %>% as.character()))

Working example

The problem is that I can't seem to set the title per group with ggtitle in a very simple way.

Thanks!

2条回答
Luminary・发光体
2楼-- · 2019-01-08 23:51

Use .$Species to pull the species data into ggtitle:

iris %>% group_by(Species) %>% do(plots=ggplot(data=.) +
         aes(x=Petal.Width, y=Petal.Length) + geom_point() + ggtitle(unique(.$Species)))
查看更多
叛逆
3楼-- · 2019-01-08 23:57

This is another option using rowwise:

plots2 = iris %>% 
    group_by(Species) %>% 
    do(plots = p %+% .) %>% 
    rowwise() %>%
    do(x=.$plots + ggtitle(.$Species))
查看更多
登录 后发表回答