web-dev-qa-db-ja.com

dplyrを使用してグループごとにggplot関数を適用し、グループごとにタイトルを設定する

データフレームのグループごとに1つの個別のプロットを作成し、グループをタイトルに含めたいと思います。

アイリスデータセットを使用して、ベースRとggplotでこれを行うことができます

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

Dplyrを使用して同等のものはありますか?

タイトルの代わりにファセットを使用する試みは次のとおりです。

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

ここで、%+%を使用して、pのデータセットを各呼び出しのサブセットに置き換えます。

Workaround with facets

または(動作するが複雑)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

問題は、非常に単純な方法でggtitleを使用してグループごとのタイトルを設定できないように見えることです。

ありがとう!

24
bytesinflight

使用する .$Speciesを使用して、種データをggtitleに取り込みます。

iris %>% group_by(Species) %>% do(plots=ggplot(data=.) +
         aes(x=Petal.Width, y=Petal.Length) + geom_point() + ggtitle(unique(.$Species)))
43
James

dplyr 0.8.0から、group_mapを使用できます。

library(dplyr, warn.conflicts = FALSE, quietly = TRUE)
#> Warning: le package 'dplyr' a été compilé avec la version R 3.5.2
library(ggplot2)
plots3 <- iris %>%
  group_by(Species) %>%
  group_map(~tibble(plots=list(
    ggplot(.) + aes(x=Petal.Width, y=Petal.Length) + geom_point() + ggtitle(.y[[1]]))))

plots3
#> # A tibble: 3 x 2
#> # Groups:   Species [3]
#>   Species    plots   
#>   <fct>      <list>  
#> 1 setosa     <S3: gg>
#> 2 versicolor <S3: gg>
#> 3 virginica  <S3: gg>
plots3$plots[[2]]

2019-02-18に reprexパッケージ (v0.2.0)によって作成されました。

3

これは、rowwiseを使用する別のオプションです。

plots2 = iris %>% 
    group_by(Species) %>% 
    do(plots = p %+% .) %>% 
    rowwise() %>%
    do(x=.$plots + ggtitle(.$Species))
1
Matthew Plourde