2013-03-25 16 views
6

Ich möchte zwei verschiedene Datensätze in einem scatterplot matrix plotten.Verschiedene Daten im oberen und unteren Bereich der Streudiagramm-Matrix

Ich weiß, dass ich upper.panel und lower.panel verwenden kann, um die Plotfunktion zu unterscheiden. Es gelingt mir jedoch nicht, meine Daten in ein geeignetes Format zu bringen, um dies zu nutzen.

Angenommen, ich habe zwei Gewebe ("Gehirn" und "Herz") und vier Bedingungen (1-4). Jetzt kann ich z.B. pairs(data$heart), um eine Streudiagrammmatrix für einen der Datensätze zu erhalten. Angenommen, ich habe die folgenden Daten:

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

Wie bekomme ich diese in ein Format, so dass pairs(data, …) Plots ein Datensatz oberhalb und unterhalb der Diagonalen, wie hier dargestellt (grün = Gehirn, violett = Herz):

screenshot

Gerade

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

verwenden, da funktioniert nicht, dass alle Bedingungen im Vergleich zu allen Bedingungen ohne erneute plotten gard für verschiedene Gewebe - es ignoriert im Wesentlichen die Liste, und das gleiche bei der Neuordnung der Hierarchie (d. h. mit data = (A=list(brain=…, heart=…), B=list(brain=…, heart=…), …)).

+0

Hier ist ein Beispiel für verschiedene Inhalte in den oberen und unteren Teile, vielleicht können Sie es für Ihre Bedürfnisse anpassen? http://gallery.r-enthusiast.com/graph/Correlation_Matrix_137 – Ben

+0

@Ben Dieses Beispiel ist in der Dokumentation, aber es zeichnet nicht verschiedene Daten, nur die gleichen Daten in einem anderen Format. –

Antwort

7

Dies ist das beste, das ich scheinen über Geben von Argumenten zu tun in der Lage:

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

Beachten Sie, dass jede Platte alle Argumente benötigt. ... ist eine grausame Geliebte. Wenn Sie nur die panelspezifischen Argumente in jede Funktion einfügen, scheint es zu funktionieren, aber Sie erhalten viele und viele Warnungen von R, die versuchen, diese Argumente an normale Plotfunktionen weiterzugeben, und offensichtlich werden sie nicht existieren.

Dies war mein erster Versuch, schnell, aber es scheint hässlich:

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

ich eine etwas hässliche Art und Weise in dieser zweiten Version R Scoping hier zu missbrauchen. (Natürlich könnte man wahrscheinlich tut dies mehr sauber in Gittern, aber Sie wahrscheinlich, dass wussten.)

Die einzige andere Option, die ich denken kann, ist Ihre eigene Streudiagramm-Matrix layout mit zu entwerfen, aber das ist wahrscheinlich recht ein bisschen Arbeit.

Lattice bearbeiten

Hier ist zumindest ein Anfang auf einem Gitter Lösung. Es sollte behandeln, variierende x, y-Achse reicht besser, aber ich habe das nicht getestet.

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

Sehr geschickter Einsatz von '...' um 'ind.upper' und' ind.lower' zu durchlaufen!Warum nicht deine (bessere) revidierte Antwort die Hauptfrage machen und sie oben zeigen? –

+0

@JoshOBrien rannte aus der Tür zum Catcha-Bus. Ich werde bearbeiten, wenn ich nach Hause komme. (Und ich glaube, ich liege falsch, wenn ich alle Argumente in jeder Funktion brauche ...) – joran

+0

Übrigens kann ich wirklich keinen Weg finden, dies "sauberer mit Gitter" zu tun - tatsächlich scheint Gitter unter dem gleichen Problem zu leiden aber da die Dokumentation nicht großartig ist, bin ich mir eigentlich nicht sicher. Das obige Verfahren schlägt leider fehl, wenn die zwei Datensätze unterschiedliche Wertebereiche haben (da 'Paare' die einzelnen Zellen begrenzen, die * alle * Daten berücksichtigen), so dass ich an einer Alternative interessiert bin. –

Verwandte Themen