web-dev-qa-db-fra.com

Applique une fonction ggplot par groupe avec dplyr et définit le titre par groupe

Je souhaite créer un tracé distinct par groupe dans un bloc de données et inclure le groupe dans le titre.

Avec le jeu de données iris, je peux le faire en base R et ggplot

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

Existe-t-il un équivalent utilisant dplyr?

Voici une tentative d'utilisation de facettes au lieu de titre.

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

où j'utilise% +% pour remplacer l'ensemble de données de p par le sous-ensemble de chaque appel.

Workaround with facets

ou (travail mais complexe) avec 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

Le problème est que je n'arrive pas à définir le titre par groupe avec ggtitle de manière très simple.

Merci!

20
bytesinflight

Utilisez .$Species pour extraire les données sur les espèces dans ggtitle:

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

Ceci est une autre option utilisant rowwise:

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

À partir de dplyr 0.8.0, nous pouvons utiliser 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]]

Créé le 2019-02-18 par le paquet reprex (v0.2.0).

0
Moody_Mudskipper