2010-09-17 21 views
81

E 'possibile tracciare una matrice di grafici a dispersione con ggplot2, utilizzando le simpatiche funzionalità di ggplot come mappare fattori aggiuntivi per il colore, la forma ecc. E l'aggiunta più agevole?Creare una matrice di grafici a dispersione (equivalente a coppie) in ggplot2

Sto pensando a qualcosa di simile alla funzione basepairs.

+15

controllare ggally – hadley

+1

Ah Inoltre, non ho visto il tuo commento ci Hadley. Ho fatto la mia risposta in CW per non rubare il tuo credito :) – naught101

risposta

22

Si potrebbe desiderare di provare plotmatrix:

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

a me mpg (prima colonna a mtcars) non dovrebbe essere un fattore. Non l'ho controllato, ma non c'è motivo per cui dovrebbe esserlo. Tuttavia ho un grafico a dispersione :)


Nota: Per riferimento futuro, la funzione plotmatrix() è stata sostituita dalla funzione ggpairs() dal pacchetto GGally come @ naught101 suggerisce in another response below a questa domanda.

+0

Non riuscivo a far funzionare la faceting su questo problema, sembra che richieda fattori sul lato destro della formula .. O potresti darmi un esempio minimo? –

+1

Qualcuno sa come aggiungere il colore? Non riesco a ottenere questo https://gist.github.com/1405150 per funzionare –

+0

La prima parte di questa risposta è errata e causa di confusione. Non si possono fare grafici a coppie con sfaccettature: si possono fare solo y per x diagrammi e raggrupparli per fattori. In altre parole, con la sfaccettatura hai lo stesso xey su ogni sotto-trama; con le coppie, hai una x diversa per ogni colonna e una y diversa per ogni riga. – naught101

171

Continuo a voler farlo, ma plotmatrix è una schifezza. Hadley recommends utilizzando il GGally package invece. Ha una funzione, ggpairs che è un grafico a coppie notevolmente migliorato (consente di utilizzare variabili non continue nei frame di dati). Si trame diverse trame in ogni quadrato, a seconda dei tipi di variabili:

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

enter image description here

+22

Questo è davvero fantastico. Vale la pena notare che qualsiasi variabile di 'colore 'deve essere un fattore; ho passato 45 minuti a capirlo. – gregmacfarlane

+0

+1. A proposito, sai come regolare i grafici in modo che le etichette siano mostrate nella loro interezza e non sovrapposte? –

+1

Esiste un modo per tracciare queste matrici di correlazione senza coppie?Per esempio ho bisogno di tracciare la prima colonna rispetto a tutte le altre colonne. Gli accoppiamenti danno una coppia molto possibile. Ad esempio, ho 10 colonne e mi dà 10 * 10 = 100.Ma voglio 1a colonna vs altre 9 solo – Rgeek

4

Se si vuole ottenere un oggetto ggplot (non ggmatrix come nel caso di ggpairs()), la soluzione è quella di fondere il dati due volte, quindi ggplot con sfaccettatura. facet_wrap sarebbe meglio di facet_grid nel limitare l'area tracciata, dato il parametro scales = 'free' è fornito.

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

Problemi correlati