2012-05-08 13 views
19

Pisałem funkcję, która zwraca wektor nazw kolorów:zmienić Domyślna paleta kolorów w 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) 
} 

Chciałbym ggplot korzystać z powyższych funkcji do generowania paletę domyślnie. Może tylko dla dyskretnych skal. Użycie za każdym razem jest zbyt dużym oporem. Czy to możliwe?

+6

[to post] (http://groups.google.com/group/ggplot2-dev/browse_thread/thread/fc838059c281e835?pli=1) powinny być przydatne. – baptiste

+0

Dzięki. Zatrzymam to na później, ale teraz utknąłem w wersji 0.8.9. –

Odpowiedz

5

@baptiste wskazał mi na post na forum, który wymienia funkcję set_default_scale, która może być użyta do ustawienia domyślnej palety. Poniższe rozwiązanie działa tylko ze starszymi wersjami ggplot2.

Najpierw potrzebujemy funkcji, która tworzy nazwy kolorów lub kody. Zadzwoniłem kopalni 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) 
} 

(Przyjmuje opcjonalnego set argumentu, żeby pokazać, że nie są ograniczone do jednej palecie.) Ok, teraz możemy stworzyć „Scale”, który nazwałem magazine. Jest on oparty na skali browaru ggplot i kod jest dość brzydki:

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

Ważną rzeczą jest, aby określić output_set która to funkcja ggplot połączeń, aby uzyskać nazwy kolorów/kodów. Ponadto, jeśli potrzebujesz dodatkowych argumentów, muszą one być zawarte w new, a później mogą być dostępne jako .$argument_name. W powyższym przykładzie output_set po prostu wywołuje magazine.colours.

Teraz, sprawdź czy nowa skala rzeczywiście działa:

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

Aby uczynić go domyślnym, wystarczy użyć set_default_scale.

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

I to będzie to.

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

plot showing the new palette

15

przedefiniować domyślny skalę kolorów można też po prostu przedefiniować funkcję ggplot:

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

Te same prace dla skali wypełnienia.

+0

Proste i piękne. – Peque

+6

, które prawdopodobnie spowodują problemy podczas mapowania zmiennej ciągłej na kolor – baptiste

3

Wystarczy przypisać zmienną z nazwą żądanej skali:

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

ta działa od ggplot zajmie jego waga domyślnych z globalnym środowisku, jeśli to możliwe, podobnie jak:

get('scale_colour_discrete', envir = globalenv()) 
Powiązane problemy