web-dev-qa-db-fra.com

Créer une matrice de diagrammes de dispersion (paires (équivalent)) dans ggplot2

Est-il possible de tracer une matrice de nuages ​​de points avec ggplot2, en utilisant ggplot 'Nice, comme la cartographie de facteurs supplémentaires pour la couleur, la forme, etc.

Je pense à quelque chose de similaire à la fonction base. pairs.

102
Karsten W.

Vous voudrez peut-être essayer plotmatrix:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

me mpg (première colonne de mtcars) ne devrait pas être un facteur. Je ne l'ai pas vérifié, mais il n'y a aucune raison pour que ce soit le cas. Cependant, je reçois un nuage de points :)


Remarque: Pour référence ultérieure, la fonction plotmatrix() a été remplacée par la fonction ggpairs() de la fonction GGally paquet comme @ naught101 suggère dans une autre réponse ci-dessous à cette question.

29
Matt Bannert

Je continue à vouloir faire cela, mais l'intrigue est une merde. Hadley recommande en utilisant plutôt le paquet GGally . Il a une fonction, ggpairs qui est un tracé de paires grandement amélioré (vous permet d'utiliser des variables non continues dans vos trames de données). Il trace différentes parcelles dans chaque carré, en fonction des types de variables:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

enter image description here

210
naught101

Si on veut obtenir un objet ggplot (et non ggmatrix comme dans le cas de ggpairs()), la solution consiste à faire fondre les données deux fois, puis ggplot avec facettage. facet_wrap Serait préférable à facet_grid Pour limiter la surface tracée, étant donné que le paramètre scales = 'free' Est fourni.

require(ggplot2) 
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)
}

iris %>% 
  gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) +
      geom_point() + 
      geom_smooth(method = 'lm') +
      facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) +
      scale_color_brewer(type = 'qual')
}

enter image description here

12
mjktfw