2010-09-17 12 views
81

Est-il possible de tracer une matrice de nuages ​​de points avec ggplot2, en utilisant les fonctionnalités intéressantes de ggplot comme mapper des facteurs supplémentaires de couleur, de forme, etc.Créer une matrice de diagrammes de dispersion (pairs() équivalents) dans ggplot2

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

+15

Consultez également ggally – hadley

+1

Ah, je ne vois pas ton commentaire il hadley. J'ai fait ma réponse CW pour ne pas voler votre crédo :) – naught101

Répondre

22

Vous pouvez essayer plotmatrix:

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

me mpg (première colonne 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 :)


Note: Pour référence ultérieure, la fonction plotmatrix() a été remplacée par la fonction ggpairs() du package GGally que @ naught101 suggère in another response below à cette question.

+0

Je n'ai pas eu de facette à travailler sur ce problème, il semble qu'il faut des facteurs du côté droit de la formule .. Ou pourriez-vous me donner un exemple minimal? –

+1

Quelqu'un sait-il comment ajouter de la couleur? Je ne semble pas être en mesure d'obtenir ce https://gist.github.com/1405150 au travail –

+0

La première partie de cette réponse est fausse, et causer de la confusion. Vous ne pouvez pas faire des tracés de paires avec facettage: vous ne pouvez faire que y par x tracés, et les regrouper par facteurs. En d'autres termes, avec facettage, vous avez les mêmes x et y sur chaque sous-placette; avec les paires, vous avez un x différent sur chaque colonne et un y différent sur chaque ligne. – naught101

171

Je continue à vouloir faire cela, mais plotmatrix est de la merde. Hadley recommends en utilisant le GGally package à la place. 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 les 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

+22

C'est vraiment génial. Il est à noter que toute variable «color» doit être un facteur; J'ai passé 45 minutes à le trouver. – gregmacfarlane

+0

+1. Au fait, savez-vous comment ajuster les parcelles afin que les étiquettes soient représentées dans leur intégralité et ne se chevauchent pas? –

+1

Y at-il un moyen de tracer ces matrices de corrélation sans paires?Par exemple, j'ai besoin de tracer la première colonne par rapport à une autre colonne.ggpairs donne une paire très possible.Par exemple, j'ai 10 colonnes et il me donne 10 * 10 = 100.Mais je veux 1ère colonne vs autre 9 seulement – Rgeek

4

Si l'on veut obtenir un objet ggplot (non ggmatrix comme dans le cas de ggpairs()), la solution consiste à faire fondre la données deux fois, puis ggplot avec facettage. facet_wrap serait mieux que facet_grid en limitant la zone 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