Cree una matriz de diagramas de dispersión (pares () equivalentes) en ggplot2

117

¿Es posible trazar una matriz de gráficos de dispersión con ggplot2, el uso de ggplot's características agradables como los mapas de factores adicionales a color, forma, etc. y añadiendo más suave?

Estoy pensando en algo similar a la basefunción pairs.

Karsten W.
fuente
17
También echa un vistazo a ggally
hadley
1
Ah, no vi tu comentario allí hadley. Hice mi respuesta CW para no robar tu credibilidad :)
nada101

Respuestas:

37

Es posible que desee probar plotmatrix:

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

para mí, mpg (primera columna en mtcars) no debería ser un factor. No lo he comprobado, pero no hay ninguna razón por la que deba ser uno. Sin embargo, obtengo un diagrama de dispersión :)


Nota: Para referencia futura, la plotmatrix()función ha sido reemplazada por la ggpairs()función del GGallypaquete como sugiere @ naught101 en otra respuesta a continuación a esta pregunta.

Matt Bannert
fuente
No pude conseguir que las facetas funcionen en este problema, parece que requiere factores en el lado derecho de la fórmula. ¿O podría darme un ejemplo mínimo?
Karsten W.
1
¿Alguien sabe cómo agregar color? No parecen ser capaces de conseguir este gist.github.com/1405150 al trabajo
Etienne baja Décarie
1
La primera parte de esta respuesta es incorrecta y causa confusión. No puede hacer gráficos de pares con facetado: solo puede hacer gráficos de y por x y agruparlos por factores. En otras palabras, con la creación de facetas tienes la misma xey en cada subparcela; con pares, tiene una x diferente en cada columna y una y diferente en cada fila.
naught101
28
Para referencia futura, la plotmatrix()función ha sido reemplazada por la ggpairs()función del GGallypaquete como sugiere @ naught101 en otra respuesta a esta pregunta.
smillig
1
@MattBannert agregó el comentario a su publicación para que sea más visible, podría entender a los votantes en contra si hubiera omitido leer los comentarios. Espero que no te importe.
zx8754
232

Sigo queriendo hacer esto, pero plotmatrix es una mierda. Hadley recomienda usar el paquete GGally en su lugar. Tiene una función, ggpairs , que es un diagrama de pares muy mejorado (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))

ingrese la descripción de la imagen aquí

cero101
fuente
26
Esto es realmente grandioso. Vale la pena señalar que cualquier colourvariable tiene que ser un factor; Pasé 45 minutos averiguando eso.
gregmacfarlane
1
¿Hay alguna forma de trazar estas matrices de correlación sin pares? Por ejemplo, necesito trazar la primera columna frente a todas las demás columnas.ggpairs da un par muy posible.Por ejemplo, tengo 10 columnas y me da 10 * 10 = 100.Pero yo quiero 1ra columna vs otras 9 solamente
Rgeek
1
@Rgeek: podría meltusar el marco de datos usando la variable que le interesa como una variable de identificación y luego facetar con las otras variables.
naught101
6
No use ggpairs, solo use ggplot2 normalmente, como ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Supongo que estás hablando de diagramas de dispersión cuando dices "diagrama de correlación", porque de otra manera nunca había oído hablar de eso.
naught101
3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP
17

Si uno quiere obtener un ggplotobjeto (no ggmatrixcomo en el caso de ggpairs()), la solución es fundir los datos dos veces, luego ggplotcon facetas. facet_wrapsería mejor que facet_gridlimitar el área trazada, dado scales = 'free'que se proporciona el parámetro.

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')
}

ingrese la descripción de la imagen aquí

mjktfw
fuente