Crea una matrice di grafici a dispersione (coppie () equivalenti) in ggplot2


117

È possibile tracciare una matrice di grafici a dispersione con ggplot2, utilizzando ggplotle caratteristiche interessanti di come la mappatura di fattori aggiuntivi per colore, forma, ecc. E l'aggiunta di più uniformità?

Sto pensando a qualcosa di simile alla basefunzione pairs.


17
Controlla anche ggally
hadley

1
Ah, non ho visto il tuo commento lì Hadley. Ho fatto la mia risposta in CW per non rubarti la credibilità :)
nought101

Risposte:


37

Potresti provare plotmatrix:

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

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


Nota: per riferimento futuro, la plotmatrix()funzione è stata sostituita dalla ggpairs()funzione del GGallypacchetto come suggerisce @ naught101 in un'altra risposta a questa domanda.


Non sono riuscito a far funzionare la sfaccettatura su questo problema, sembra che richieda fattori sul lato destro della formula .. O potresti farmi un esempio minimo?
Karsten W.

1
Qualcuno sa come aggiungere il colore? Non mi sembra di essere in grado di ottenere questo gist.github.com/1405150 al lavoro
Etienne bassa Décarie

1
La prima parte di questa risposta è sbagliata e causa confusione. Non è possibile eseguire grafici di coppie con sfaccettatura: è possibile eseguire solo grafici y per x e raggrupparli per fattori. In altre parole, con la sfaccettatura hai la stessa x e y su ogni sottotrama; con le coppie, hai una x diversa su ogni colonna e una y diversa su ogni riga.
nought101

28
Per riferimento futuro, la plotmatrix()funzione è stata sostituita dalla ggpairs()funzione del GGallypacchetto come suggerisce @ naught101 in un'altra risposta a questa domanda.
smillig

1
@ MattBannert ha aggiunto il commento al tuo post per renderlo più visibile, avrei potuto capire i downvoters se avessi saltato la lettura dei commenti. Spero non ti dispiaccia.
zx8754

232

Continuo a desiderare di farlo, ma plotmatrix è una schifezza. Hadley consiglia invece di utilizzare il pacchetto GGally . Ha una funzione, ggpairs , che è un grafico a coppie notevolmente migliorato (consente di utilizzare variabili non continue nei frame di dati). Traccia diversi grafici in ogni quadrato, a seconda dei tipi di variabili:

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

inserisci qui la descrizione dell'immagine


26
Questo è davvero fantastico. Vale la pena notare che qualsiasi colourvariabile deve essere un fattore; abbiamo impiegato 45 minuti per capirlo.
gregmacfarlane

1
C'è un modo per tracciare queste matrici di correlazione senza coppie? Ad esempio, devo tracciare la prima colonna rispetto a ogni altra colonna.ggpairs fornisce una coppia molto possibile.Per esempio, ho 10 colonne e mi dà 10 * 10 = 100.Ma io voglio solo la prima colonna rispetto alle altre 9
Rgeek

1
@Rgeek: potresti meltutilizzare il dataframe utilizzando la variabile che ti interessa come variabile id, quindi sfaccettare dalle altre variabili.
nought101

6
Non usare ggpairs, usa semplicemente ggplot2 normalmente, come ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Suppongo che tu stia parlando di grafici a dispersione quando dici "grafico di correlazione", perché altrimenti non ne ho mai sentito parlare.
nought101

3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP

17

Se si vuole ottenere un ggplotoggetto (non ggmatrixcome nel caso di ggpairs()), la soluzione è fondere i dati due volte, quindi ggplotcon sfaccettatura. facet_wrapsarebbe meglio che facet_gridlimitare l'area tracciata, dato che il scales = 'free'parametro è 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')
}

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.