2012-05-08 1 views
19

Ho scritto una funzione che restituisce un vettore di nomi di colori:cambiare la tavolozza dei colori di default in ggplot

custom.colors <- function(n) { 
    palette <- c("dodgerblue1", "skyblue4", "chocolate1", "seagreen4", 
       "bisque3", "red4", "purple4", "mediumpurple3", 
       "maroon", "dodgerblue4", "skyblue2", "darkcyan", 
       "darkslategray3", "lightgreen", "bisque", 
       "palevioletred1", "black", "gray79", "lightsalmon4", 
       "darkgoldenrod1") 
    if (n > length(palette)) 
    warning('palette has duplicated colours') 
    rep(palette, length.out=n) 
} 

Vorrei ggplot di utilizzare la funzione di cui sopra per generare la tavolozza di default. Forse solo per scale discrete. Utilizzare scale_manual() ogni volta è troppo di trascinamento. È possibile?

+6

[questo post] (http://groups.google.com/group/ggplot2-dev/browse_thread/thread/fc838059c281e835?pli=1) dovrebbe essere utile. – baptiste

+0

Grazie. Lo terrò per dopo, ma ora sono bloccato con la versione 0.8.9. –

risposta

5

@baptiste mi ha indirizzato a un post della bacheca che menziona la funzione set_default_scale che può essere utilizzata per impostare una tavolozza predefinita. La seguente soluzione funziona solo con le vecchie versioni di ggplot2, comunque.

Per prima cosa abbiamo bisogno di una funzione che produca nomi di colori o codici. Ho chiamato il mio magazine.colours:

magazine.colours <- function(n, set=NULL) { 
    set <- match.arg(set, c('1', '2')) 
    palette <- c("red4", "darkslategray3", "dodgerblue1", "darkcyan", 
       "gray79", "black", "skyblue2", "dodgerblue4", 
       "purple4", "maroon", "chocolate1", "bisque3", "bisque", 
       "seagreen4", "lightgreen", "skyblue4", "mediumpurple3", 
       "palevioletred1", "lightsalmon4", "darkgoldenrod1") 
    if (set == 2) 
    palette <- rev(palette) 
    if (n > length(palette)) 
    warning('generated palette has duplicated colours') 
    rep(palette, length.out=n) 
} 

(Si accetta un argomento opzionale set solo a dimostrare che non si è limitato a una singola palette.) Ok, ora creiamo una "scala", che ho chiamato magazine. Si basa su scala birraio di ggplot e il codice è abbastanza brutto:

ScaleMagazine <- proto(ScaleColour, expr={ 
    objname <- 'magazine' 
    new <- function(., name=NULL, set=NULL, na.colour='yellowgreen', 
        limits=NULL, breaks = NULL, labels=NULL, 
        formatter = identity, variable, legend = TRUE) { 
    b_and_l <- check_breaks_and_labels(breaks, labels) 
    .$proto(name=name, set=set, .input=variable, .output=variable, 
      .labels = b_and_l$labels, breaks = b_and_l$breaks, 
      limits= limits, formatter = formatter, legend = legend, 
      na.colour = na.colour) 
    } 
    output_set <- function(.) { 
    missing <- is.na(.$input_set()) 
    n <- sum(!missing) 
    palette <- magazine.colours(n, .$set) 
    missing_colour(palette, missing, .$na.colour) 
    } 
    max_levels <- function(.) Inf 
}) 
scale_colour_magazine <- ScaleMagazine$build_accessor(list(variable = '"colour"')) 
scale_fill_magazine <- ScaleMagazine$build_accessor(list(variable = '"fill"')) 

La cosa importante è quello di definire output_set che è la funzione che ggplot chiamate per ottenere i nomi dei colori/codici. Inoltre, se sono necessari argomenti aggiuntivi, è necessario includerli in new e successivamente come .$argument_name. Nell'esempio sopra, output_set chiama semplicemente magazine.colours.

Ora, controllare la nuova scala realtà non funziona:

qplot(mpg, wt, data=mtcars, shape=21, 
     colour=factor(carb), fill=factor(carb)) + 
    scale_colour_magazine(set='1') + 
    scale_fill_magazine(set='1') 

per renderlo il valore predefinito, è sufficiente utilizzare set_default_scale.

set_default_scale("colour", "discrete", "magazine") 
set_default_scale("fill", "discrete", "magazine") 

E così sarà.

> qplot(mpg, wt, data=mtcars, colour=factor(carb), fill=factor(carb)) 

plot showing the new palette

15

per ridefinire la scala di colori di default si può anche semplicemente ridefinire la funzione ggplot:

ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer(palette="Spectral") 

Le stesse opere per la scala di riempimento.

+0

Semplice e bello. – Peque

+6

che probabilmente causerà problemi quando si mappa una variabile continua a colori – baptiste

3

sufficiente assegnare una variabile con il nome della vostra scala desiderata:

scale_colour_discrete <- function(...) 
    scale_colour_manual(..., values = c('dodgerblue1', *)) 

Questo funziona poiché ggplot prenderà le sue scale di default dall'ambiente globale, se possibile, in modo simile a:

get('scale_colour_discrete', envir = globalenv())