Créer une matrice de nuages ​​de points (paires () équivalent) dans ggplot2

117

Est-il possible de tracer une matrice de nuages ​​de points avec ggplot2, en utilisant ggplotles fonctionnalités intéressantes de comme la cartographie de facteurs supplémentaires à la couleur, la forme, etc. et en ajoutant plus de douceur?

Je pense à quelque chose de similaire à la basefonction pairs.

Karsten W.
la source
17
Découvrez également ggally
hadley
1
Ah, je n'ai pas vu ton commentaire là-bas hadley. J'ai fait ma réponse CW pour ne pas voler votre crédit :)
rien101

Réponses:

37

Vous voudrez peut-être essayer plotmatrix:

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

pour moi 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 qu'il en soit un. Cependant, j'obtiens un nuage de points :)


Remarque: pour référence future, la plotmatrix()fonction a été remplacée par la ggpairs()fonction du GGallypackage comme @ naught101 le suggère dans une autre réponse ci-dessous à cette question.

Matt Bannert
la source
Je n'ai pas pu faire travailler les facettes sur ce problème, il semble que cela nécessite des facteurs sur le côté droit de la formule. Ou pourriez-vous me donner un exemple minimal?
Karsten W.
1
Quelqu'un sait comment ajouter de la couleur? Je ne semble pas être en mesure d'obtenir ce gist.github.com/1405150 au travail
Etienne basse Décarie
1
La première partie de cette réponse est fausse et prête à confusion. Vous ne pouvez pas faire de graphiques par paires avec facettes: vous ne pouvez faire que des graphiques y par x et les regrouper par facteurs. En d'autres termes, avec la facette, vous avez les mêmes x et y sur chaque sous-tracé; avec des paires, vous avez un x différent sur chaque colonne et un y différent sur chaque ligne.
naught101
28
Pour référence future, la plotmatrix()fonction a été remplacée par la ggpairs()fonction du GGallypackage comme @ naught101 le suggère dans une autre réponse à cette question.
smillig
1
@MattBannert a ajouté le commentaire à votre message pour le rendre plus visible, je pourrais comprendre les votes négatifs si j'avais sauté la lecture des commentaires. J'espère que cela ne vous dérange pas.
zx8754
232

Je continue à vouloir faire ça, mais plotmatrix est de la merde. Hadley recommande d' utiliser le package GGally à la place. Il a une fonction, ggpairs, qui est un tracé de paires considérablement amélioré (vous permet d'utiliser des variables non continues dans vos blocs 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))

entrez la description de l'image ici

rien101
la source
26
C'est vraiment génial. Il convient de noter que toute colourvariable doit être un facteur; a passé 45 minutes à comprendre celui-là.
gregmacfarlane
1
Existe-t-il un moyen de tracer ces matrices de corrélation sans paires? Par exemple, je dois tracer la première colonne par rapport à toutes les autres colonnes.ggpairs donne une paire très possible.Par exemple, j'ai 10 colonnes et cela me donne 10 * 10 = 100.Mais je veux 1ère colonne vs autre 9 seulement
Rgeek
1
@Rgeek: vous pouvez meltla dataframe en utilisant la variable qui vous intéresse comme variable id, puis la facette par les autres variables.
naught101
6
N'utilisez pas ggpairs, utilisez simplement ggplot2 normalement, comme ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Je suppose que vous parlez de diagrammes de dispersion lorsque vous dites «diagramme de corrélation», car je n'en ai jamais entendu parler autrement.
naught101
3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP
17

Si l'on veut obtenir un ggplotobjet (pas ggmatrixcomme dans le cas de ggpairs()), la solution est de fondre les données deux fois, puis ggplotavec facettage. facet_wrapserait mieux que facet_gridde limiter la zone tracée, étant donné que le scales = 'free'paramètre 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')
}

entrez la description de l'image ici

mjktfw
la source