Utwórz macierz wykresów rozrzutu (odpowiednik par ()) w ggplot2

117

Czy możliwe jest wykreślenie macierzy wykresów punktowych przy ggplot2użyciu ggplotfajnych funkcji, takich jak mapowanie dodatkowych czynników na kolor, kształt itp. Oraz dodawanie gładkości?

Myślę o czymś podobnym do basefunkcji pairs.

Karsten W.
źródło
17
Zobacz także ggally
Hadley
1
Ach, nie widziałem twojego komentarza hadleya. Zrobiłem odpowiedź CW, aby nie ukraść twojego
kredytu

Odpowiedzi:

37

Możesz spróbować plotmatrix:

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

dla mnie mpg (pierwsza kolumna w mtcars) nie powinno być czynnikiem. Nie sprawdzałem tego, ale nie ma powodu, dla którego miałby to być. Jednak dostaję wykres punktowy :)


Uwaga: na przyszłość, plotmatrix()funkcja została zastąpiona ggpairs()funkcją z GGallypakietu, jak sugeruje @ naught101 w innej odpowiedzi poniżej na to pytanie.

Matt Bannert
źródło
Nie mogłem uzyskać facetingu do pracy nad tym problemem, wydaje się, że wymaga on czynników po prawej stronie wzoru .. A może możesz mi podać minimalny przykład?
Karsten W.
1
Czy ktoś wie, jak dodać kolor? I nie wydają się być w stanie uzyskać ten gist.github.com/1405150 do pracy
Etienne niskiego Decarie
1
Pierwsza część tej odpowiedzi jest zła i powoduje zamieszanie. Nie możesz tworzyć par wykresów z fasetowaniem: możesz robić tylko wykresy y na x i grupować je według czynników. Innymi słowy, przy fasetowaniu masz takie same x i y na każdym pod-wykresie; w przypadku par masz różne x w każdej kolumnie i różne y w każdym wierszu.
naught101
28
Na przyszłość, plotmatrix()funkcja została zastąpiona ggpairs()funkcją z GGallypakietu, jak sugeruje @ naught101 w innej odpowiedzi na to pytanie.
smillig
1
@MattBannert dodał komentarz do Twojego posta, aby był bardziej widoczny. Mogę zrozumieć osoby odbierające głos, jeśli pominąłbym czytanie komentarzy. Mam nadzieję, że nie masz nic przeciwko.
zx8754,
232

Wciąż chcę to zrobić, ale Plotmatrix to bzdura. Hadley zaleca zamiast tego używanie pakietu GGally . Posiada funkcję ggpairs, która jest znacznie ulepszonym wykresem par (pozwala na używanie zmiennych nieciągłych w ramkach danych). Wykreśla różne działki na każdym kwadracie, w zależności od zmiennych typów:

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

wprowadź opis obrazu tutaj

zera 101
źródło
26
To jest naprawdę świetne. Warto zauważyć, że każda colourzmienna musi być czynnikiem; spędził 45 minut, zastanawiając się nad tym.
gregmacfarlane
1
Czy istnieje sposób, aby wykreślić te macierze korelacji bez par? Na przykład muszę wykreślić pierwszą kolumnę w stosunku do każdej innej kolumny. Ggpairs daje bardzo możliwą parę. Na przykład mam 10 kolumn i to daje mi 10 * 10 = 100.Ale ja chcę tylko pierwszą kolumnę przeciwko innym 9
Rgeek
1
@Rgeek: możesz meltutworzyć ramkę danych używając zmiennej, którą jesteś zainteresowany jako zmienną id, a następnie przejrzeć inne zmienne.
naught101
6
Nie używaj ggpairs, po prostu normalnie używaj ggplot2, na przykład ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Zakładam, że mówisz o wykresach rozrzutu, kiedy mówisz „wykres korelacji”, ponieważ inaczej nigdy o tym nie słyszałem.
naught101
3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP
17

Jeśli chce się otrzymać ggplotobiekt (nie ggmatrixtak jak w przypadku ggpairs()), rozwiązaniem jest dwukrotne stopienie danych, a następnie ggplotfasetowanie. facet_wrapbyłoby lepsze niż facet_gridw ograniczaniu wykreślanego obszaru, przy podanym scales = 'free'parametrze.

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

wprowadź opis obrazu tutaj

mjktfw
źródło