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.


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.


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.