scale_fill_manual paletas los guides guide_legend ggplot escala ejes como colores color cambiar r ggplot2

los - paletas de colores en r



cambiar la paleta de colores por defecto en ggplot (3)

He escrito una función que devuelve un vector de nombres de colores:

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

Me gustaría que ggplot use la función anterior para generar la paleta por defecto. Tal vez sólo para escalas discretas. Usar scale_manual() cada vez es un arrastre demasiado grande. ¿Es posible?


@baptiste me señaló una publicación en el tablero de mensajes que menciona la función set_default_scale que se puede usar para establecer una paleta predeterminada. Sin embargo, la siguiente solución solo funciona con versiones antiguas de ggplot2.

Primero necesitamos una función que produzca nombres o códigos de colores. Llamé a la 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) }

(Acepta un argumento de set opcional solo para mostrar que no está restringido a una sola paleta). Bien, ahora creamos una "escala", a la que llamé magazine . Se basa en la escala de cervecero de ggplot y el código es bastante feo:

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

Lo importante aquí es definir output_set que es la función que ggplot llama para obtener los nombres / códigos de color. Además, si necesita argumentos adicionales, estos deben incluirse en new y más adelante se puede acceder a. En el ejemplo anterior, output_set simplemente llama magazine.colours .

Ahora, compruebe que la nueva escala realmente funciona:

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

Para que sea el predeterminado, simplemente use set_default_scale .

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

Y eso será todo.

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


Para redefinir la escala de color predeterminada, también puede redefinir la función ggplot :

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

Lo mismo funciona para la escala de relleno.


Simplemente asigne una variable con el nombre de su escala deseada:

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

Esto funciona ya que ggplot tomará sus escalas predeterminadas del entorno global si es posible, de manera similar a:

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