2013-03-25 11 views
6

Chcę wykreślić dwa różne zestawy danych w scatterplot matrix.Różne dane w górnym i dolnym panelu macierzy wykresu rozrzutu

Wiem, że mogę używać upper.panel i lower.panel do rozróżnienia funkcji wydruku . Jednak nie udało mi się umieścić moich danych w odpowiednim formacie, aby to wykorzystać.

Załóż, że mam dwie tkanki ("mózg" i "serce") i cztery warunki (1-4). Teraz mogę użyć np. pairs(data$heart), aby uzyskać macierz rozproszoną dla jednego ze zbiorów danych. Przyjmijmy, mam następujące dane:

conditions <- 1 : 4 
noise <- rnorm(100) 
data <- list(brain = sapply(conditions, function (x) noise + 0.1 * rnorm(100)), 
      heart = sapply(conditions, function (x) noise + 0.3 * rnorm(100))) 

Jak mogę to do formatu tak, że pairs(data, …) Działki jeden zestaw danych powyżej i jeden poniżej przekątnej, jak pokazano tutaj (zielony = mózg, fioletowy = serca):

screenshot

Wystarczy za pomocą

pairs(data, upper.panel = something, lower.panel = somethingElse) 

nie działa, ponieważ to będzie wykreślić wszystkie warunki kontra każdych warunkach bez ponownego gard dla różnych tkanek - w zasadzie ignoruje listę, i to samo przy zmianie kolejności hierarchii (tj. o data = (A=list(brain=…, heart=…), B=list(brain=…, heart=…), …)).

+0

Oto przykład różnych treści w górnej i dolnej części, może możesz dostosować go do swoich potrzeb? http://gallery.r-enthusiasts.com/graph/Correlation_Matrix_137 – Ben

+0

@Ben Ten przykład znajduje się w dokumentacji, ale nie wykreśla innych danych, tylko te same dane w innym formacie. –

Odpowiedz

7

Jest to najlepszy wydaje mi się, aby móc zrobić poprzez argumenty Podania:

foo.upper <- function(x,y,ind.upper,col.upper,ind.lower,col.lower,...){ 
    points(x[ind.upper],y[ind.upper],col = col.upper,...) 
} 

foo.lower <- function(x,y,ind.lower,col.lower,ind.upper,col.upper,...){ 
    points(x[ind.lower],y[ind.lower],col = col.lower,...) 
} 

pairs(dat[,-5], 
     lower.panel = foo.lower, 
     upper.panel = foo.upper, 
     ind.upper = dat$type == 'brain', 
     ind.lower = dat$type == 'heart', 
     col.upper = 'blue', 
     col.lower = 'red') 

Należy pamiętać, że każda płyta musi wszystkie argumenty. ... jest okrutną kochanką. Jeśli uwzględnisz tylko argumenty specyficzne dla panelu w każdej funkcji, wydaje się, że działa, ale dostajesz dużo ostrzeżeń od R, próbujących przekazać te argumenty do zwykłych funkcji kreślenia i oczywiście one nie istnieją.

To była moja pierwsza próba szybkie, ale wydaje się brzydki:

dat <- as.data.frame(do.call(rbind,data)) 
dat$type <- rep(c('brain','heart'),each = 100) 

foo.upper <- function(x,y,...){ 
    points(x[dat$type == 'brain'],y[dat$type == 'brain'],col = 'red',...) 
} 

foo.lower <- function(x,y,...){ 
    points(x[dat$type == 'heart'],y[dat$type == 'heart'],col = 'blue',...) 
} 

pairs(dat[,-5],lower.panel = foo.lower,upper.panel = foo.upper) 

enter image description here

mam nadużywa scopingu R jest tutaj w tej drugiej wersji nieco brzydki sposób. (Oczywiście, można prawdopodobnie to zrobić w bardziej elegancki w siatkowej, ale prawdopodobnie wiedział.)

Jedynym rozwiązaniem można myślę jest zaprojektowanie własnego macierzy wykres punktowy przy użyciu layout, ale to chyba dość trochę pracy.

Lattice Edycja

Oto przynajmniej początek na rozwiązanie siatkowej. It powinien uchwyt zmienny zakresy osi x, y lepiej, ale nie przetestowałem tego.

dat <- do.call(rbind,data) 
dat <- as.data.frame(dat) 
dat$grp <- rep(letters[1:2],each = 100) 

plower <- function(x,y,grp,...){ 
    panel.xyplot(x[grp == 'a'],y[grp == 'a'],col = 'red',...) 
} 

pupper <- function(x,y,grp,...){ 
    panel.xyplot(x[grp == 'b'],y[grp == 'b'],...) 
} 

splom(~dat[,1:4], 
     data = dat, 
     lower.panel = plower, 
     upper.panel = pupper, 
     grp = dat$grp) 
+0

Bardzo sprytne użycie '...' do przejścia przez 'ind.upper' i' ind.lower'!Dlaczego nie dokonać (poprawionej) poprawionej odpowiedzi głównej, pokazując ją na szczycie? –

+0

@JoshOBrien Pędziła przez drzwi, żeby złapać autobus. Będę edytować, kiedy wrócę do domu. (I myślę, że nie mam racji, że potrzebuję wszystkich argumentów w każdej funkcji ...) – joran

+0

Nawiasem mówiąc, naprawdę nie mogę znaleźć żadnego sposobu, aby to zrobić "bardziej czysto z kratką" - w rzeczy samej, "kratownica" zdaje się cierpieć z tego samego problemu ale ponieważ dokumentacja nie jest świetna, nie jestem pewna. Powyższa metoda niestety nie powiedzie się, jeśli dwa zestawy danych mają różne zakresy wartości (ponieważ "pary" ograniczają liczbę komórek biorących pod uwagę * wszystkie *), więc byłbym zainteresowany alternatywą. –

Powiązane problemy