2013-02-05 15 views
15

Ich möchte die Farbpalette für die GGally Funktion ggpairs ändern. Wenn ich versuche, dem ggplot, der mit getPlot zurückgegeben wurde, ggplot-Befehle hinzuzufügen, ändern sich die Farben nicht.gibt es eine Möglichkeit, die Farbpalette für GGally :: ggpairs mit ggplot zu ändern?

my_pair_plot = ggpairs(dataset, color="var1") 
getPlot(my_pair_plot,2,1) + scale_fill_brewer(palette = "Set2") 

Versuch zu setzen ggplot in einem Fehler direkt auf die Funktionsergebnisse ggpairs Befehle.

ggpairs(dataset, color="var1") + scale_fill_brewer(palette = "Set2") 

Antwort

5

Stellt sich heraus, das ist möglich! Es erfordert, den Quellcode nachzuschlagen, aber die Lösung kommt ziemlich leicht. Wir interessieren uns für ggpairs Funktion, so ist der erste Schritt nur

ggpairs 

Mal sehen, ob wir aes Zuordnung zu füllen oder Farbe finden. Tatsächlich

combo_aes <- addAndOverwriteAes(aes_string(x = xColName, 
      y = yColName, ...), section_aes) 

Wir können hoffen, dass es tut, was es sagt. Zwei wichtige Hinweise:

  • Farbe und füllen aes sollte

  • aes_string() verwendet wird

    für den ggpairs Anruf in der Auslassungs enthalten sein

Lassen Sie uns versuchen this out:

ggpairs(diamonds[, 1:2], colour='cut') 

enter image description here

Ausgezeichnet, wir sind fast da! Wir müssen nur die Farbpalette überschreiben. Beachten Sie, dass so etwas wie Sie

ggpairs(diamonds[, 1:2], colour='cut') + scale_fill_brewer(palette = "Set2") 

vorschlagen wird nicht funktionieren, weil ggpairs Objekt kein ggplot ist, so dass die + Notation nicht unmittelbar in irgendeiner Weise. Die einfache Problemumgehung wird jedoch here bereitgestellt. Drücken Sie die Daumen und ...

ggplot <- function(...) ggplot2::ggplot(...) + scale_fill_brewer(palette="Set2") 
ggpairs(diamonds[, 1:2], colour='cut') 

enter image description here

+1

schön Hack! Hoffentlich bleibt das für eine lange Zeit zuverlässig. –

5

Update:

GGAlly wurde erneut aktualisiert und der Hack in dieser Antwort auch funktioniert nicht mehr, aber schließlich gibt es eine nicht -hack Lösung: Da

scales <- scale_colour_brewer(type = 'qual') %+% scale_fill_brewer(type = 'qual') 

Sie (in einer hoffentlich zukunftssichere Art und Weise) tun

for (row in seq_len(ps$nrow)) 
    for (col in seq_len(ps$ncol)) 
     ps[row, col] <- ps[row, col] + scales 

alte Art und Weise

Der Hack in der anderen Antwort nicht mehr funktioniert, also lasst uns einen neuen Hack!

Die interne Struktur eines ggpairs Objekt ist die Datenmenge und eine Liste von Zeichenketten:

> dta <- data.frame(a=1:6, b=7:12, c=c('f', 'g')) 
> ps <- ggpairs(dta, 1:2, colour = 'c') 
> str(ps) 
List of 10 
$ data  :'data.frame': 2 obs. of 3 variables: 
    ..$ a: int [1:2] 1 2 
    ..$ b: int [1:2] 3 4 
    ..$ c: int [1:2] 5 6 
$ columns  : int [1:3] 1 2 3 
$ plots  :List of 9 
    ..$ : chr "ggally_densityDiag(ggally_data, ggplot2::aes(x = a, colour = c))" 
    ..$ : chr "ggally_cor(ggally_data, ggplot2::aes(x = b, y = a, colour = c))" 

[...] 

$ gg   : NULL 
- attr(*, "class")= chr [1:2] "gg" "ggpairs" 

> ps 

plot before

Um den Plot zu ändern, müssen die jeweiligen Zeichenfolgen in dem Plot Objekt modifiziert werden um den zusätzlichen Befehl aufzunehmen. Dazu wir deparse(substitute(argument)) verwenden, um eine Zeichenkette, die den Code der Benutzer übergeben zu bekommen, und hängen Sie ihn an jedem Grundstück Aufruf:

add_to_plots <- function(pairs, modification) { 
    str <- deparse(substitute(modification)) 
    pairs$plots <- lapply(pairs$plots, function(s) paste(s, '+', str)) 
    pairs 
} 

> add_to_plots(ps, scale_colour_brewer(type = 'qual')) 

plot after

+0

Das funktioniert auch nicht mehr. Ich hätte gerne, dass die Dichtediagramme in der Diagonale nicht gefüllt sind, sondern wie hier gezeigt - wie mache ich das? http://stackoverflow.com/questions/34727408/how-doi-i-have-the-density-plot-not-filled-in-ggalligggpairs – Make42

+0

Dies ändert die Farben, aber nicht die Tatsache, dass mein Grundstück noch gefüllt ist. – Make42

+0

das ist ziemlich trivial, überschreiben Sie einfach die Füllung. –