changer la palette de couleurs par défaut dans ggplot

j'ai écrit une fonction qui retourne un vecteur de noms de couleur:

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

je voudrais que ggplot utilise la fonction ci-dessus pour générer la palette par défaut. Peut-être seulement pour les échelles. En utilisant scale_manual() chaque fois est trop pénible. Est-il possible?

20
demandé sur Ernest A 2012-05-08 22:57:33

3 réponses

pour redéfinir l'échelle de couleurs par défaut, vous pouvez aussi simplement redéfinir le ggplot fonction:

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

les mêmes travaux pour l'échelle de remplissage.

17
répondu Holger Brandl 2013-05-08 09:54:13

@baptiste m'a indiqué un message affiché sur un babillard électronique qui mentionne la fonction set_default_scale qui peut être utilisé pour définir une palette par défaut. La solution suivante ne fonctionne qu'avec les anciennes versions de ggplot2.

tout d'abord, nous avons besoin d'une fonction qui produit des noms de couleurs ou des codes. J'ai appelé le mien 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)
}

(Il accepte une option set argument juste pour montrer que vous n'êtes pas limité à une seule palette.) Ok, maintenant nous créons une "échelle", que j'ai appelé magazine. Il est basé sur l'échelle brewer de ggplot et le code est assez laid:

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

l'important ici est de définir output_set qui est la fonction que ggplot appelle pour obtenir les noms/codes de couleur. Aussi, si vous avez besoin d'arguments supplémentaires, celles-ci doivent être inclus dans new et plus tard peut être consulté sous la forme .$argument_name. Dans l'exemple ci-dessus, output_set simplement des appels magazine.colours.

maintenant, vérifiez que la nouvelle balance fonctionne réellement:

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

Pour en faire le par défaut, utilisez simplement set_default_scale.

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

et ce sera tout.

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

plot showing the new palette

6
répondu Ernest A 2012-05-09 01:02:04

assignez simplement une variable avec le nom de votre échelle désirée:

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

cela fonctionne puisque ggplot va prendre ses échelles par défaut de l'environnement global si possible, de la même façon que:

get('scale_colour_discrete', envir = globalenv())
3
répondu flying sheep 2017-06-01 12:09:57