2010-09-17 9 views
81

¿Es posible trazar una matriz de diagramas de dispersión con ggplot2, usando las características agradables de ggplot como mapear factores adicionales al color, forma, etc. y agregando suavizado?Crear una matriz de diagramas de dispersión (pares() equivalentes) en ggplot2

Estoy pensando en algo similar a la función basepairs.

+15

También puedes ver ggally – hadley

+1

Ah, yo no vi su comentario no Hadley. Hice mi respuesta CW para no robar tu cred :) – naught101

Respuesta

22

Es posible que desee probar plotmatrix:

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

me mpg (primera columna de mtcars) no debe ser un factor. No lo he comprobado, pero no hay ninguna razón por la que debería ser uno. Sin embargo consigo un gráfico de dispersión :)


Nota: Para referencia futura, la función plotmatrix() ha sido sustituida por la función ggpairs() del paquete GGally como @ naught101 sugiere in another response below a esta pregunta.

+0

No pude ponerle rostro a trabajar en este problema, parece que requiere factores en el lado derecho de la fórmula ... ¿O podrías darme un ejemplo mínimo? –

+1

¿Alguien sabe cómo agregar color? Parece que no puedo obtener este https://gist.github.com/1405150 para trabajar –

+0

La primera parte de esta respuesta es incorrecta y causa confusión. No puede hacer parcelas con facetas: solo puede hacer y por x gráficas, y agruparlas por factores. En otras palabras, con la facetación tiene la misma xey en cada subparcela; con pares, tiene una x diferente en cada columna, y una y diferente en cada fila. – naught101

171

Sigo queriendo hacer esto, pero plotmatrix es una porquería. Hadley recommends utilizando el GGally package en su lugar. Tiene una función, ggpairs que es una parcela de pares muy mejorada (le permite usar variables no continuas en sus marcos de datos). Traza diferentes parcelas en cada cuadrado, dependiendo de los tipos de variables:

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

enter image description here

+22

Esto es realmente genial. Vale la pena señalar que cualquier variable de 'color' tiene que ser un factor; Pasé 45 minutos pensando en eso. – gregmacfarlane

+0

+1. Por cierto, ¿sabes cómo ajustar las tramas para que las etiquetas se muestren en su totalidad y no se superpongan? –

+1

¿Hay alguna manera de trazar estas matrices de correlación sin pares?Por ejemplo, tengo que trazar la primera columna versus cada otra columna.ggpairs da un par muy posible. Por ejemplo, tengo 10 columnas y me da 10 * 10 = 100. Pero quiero 1ra columna vs otras 9 solo – Rgeek

4

Si se desea obtener un objeto ggplot (no ggmatrix como en el caso de ggpairs()), la solución consiste en fundir el datos dos veces, luego ggplot con facetado. facet_wrap sería mejor que facet_grid al limitar el área trazada, dado que se proporciona el parámetro scales = 'free'.

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

Cuestiones relacionadas