r colors ggplot2 color-palette

Cambiar colores a la paleta definida para objetos ggplot



colors ggplot2 (1)

Lo siguiente debe hacer lo que buscas. Tenga en cuenta que solo cambia los colores que se asignan a las variables. El color pasado directamente al geom_* no se verá afectado (a continuación se muestra un ejemplo). Para un enfoque que modifique el colour o el fill (el que se asigne primero), vea la mitad inferior de esta publicación.

change_colours <- function(p, palette) { n <- nlevels(p$data[[deparse(p$mapping$group)]]) tryCatch(as.character(palette), error=function(e) stop(''palette should be a vector of colours'', call.=FALSE)) if(n > length(palette)) stop(''Not enough colours in palette.'') pal <- function(n) palette[seq_len(n)] p + theme_light() + discrete_scale(''colour'', ''foo'', pal) } # Here, df is from the OP''s post p <- ggplot(df, aes(x=TS, y=price, group=stock))

Ejemplos:

# NB: custom_pal is defined in the OP''s post change_colours(p + geom_line(aes(colour=stock)), custom_pal)

change_colours(p + geom_point(aes(colour=stock)), custom_pal)

Y con una paleta diferente:

change_colours(p + geom_smooth(aes(colour=stock)), c(''firebrick'', ''midnightblue'', ''violet'', ''seagreen''))

Como se mencionó anteriormente, esto solo cambiará el colour y el fill que se asignan a las variables. Por ejemplo, no tendrá ningún efecto en los colores para lo siguiente:

change_colours(p + geom_point(colour=rep(c(''tomato'', ''hotpink'', ''cadetblue''), each=300)), custom_pal)

En respuesta al comment del OP, puede detectar fácilmente qué tipos de asignaciones se están utilizando (por ejemplo, alpha , colour , fill ). Solo mira p$layers[[1]]$mapping .

Si asumimos que la primera asignación de colour o fill de la primera capa es la asignación para la que desea cambiar los colores, puede hacerlo:

change_colours <- function(p, palette, type) { n <- nlevels(p$data[[deparse(p$mapping$group)]]) tryCatch(as.character(palette), error=function(e) stop(''palette should be a vector of colours'', call.=FALSE)) if(n > length(palette)) stop(''Not enough colours in palette.'') if(missing(type)) type <- grep(''colour|fill'', names(p$layers[[1]]$mapping), value=TRUE)[1] pal <- function(n) palette[seq_len(n)] p + theme_light() + discrete_scale(type, ''foo'', pal) } # Here, df is from the OP''s post p <- ggplot(df, aes(x=TS, y=price, group=stock))

Ejemplos:

Cambio de relleno en lugar de color:

change_colours(p + geom_point(aes(fill=stock), pch=21), c(''white'', ''grey50'', ''grey80''))

Mostrando la prioridad de la primera estética de color / relleno mapeada:

change_colours(p + geom_point(aes(fill=stock, color=stock), pch=21) + geom_smooth(aes(color=stock)), c(''black'', ''grey50'', ''grey80''))

change_colours(p + geom_point(aes(color=stock, fill=stock), pch=21) + geom_smooth(aes(color=stock)), c(''black'', ''grey50'', ''grey80''))

Reemplace la prioridad de la primera estética mapeada con el argumento de type , por ejemplo:

change_colours(p + geom_point(aes(color=stock, fill=stock), pch=21) + geom_smooth(aes(color=stock)), c(''black'', ''grey50'', ''grey80''), type=''fill'')

Me gustaría cambiar los colores predeterminados a una paleta específica para todos los objetos de tipo geom_* mediante una función.

A continuación se muestra un ejemplo de geom_line() y el uso de la función change_colours()

# load ggplot2 and tidyr library require(ggplot2) require(tidyr) # create a mock data frame df <- data.frame(cbind(var1=500*cumprod(1+rnorm(300, 0, 0.04)), var2=400*cumprod(1+rnorm(300, 0, 0.04)), var3=300*cumprod(1+rnorm(300, 0, 0.04)))) df$TS <- as.POSIXct(Sys.time()+seq(300)) df <- gather(df, stock, price, -TS) # create basic base graph p <- ggplot(df, aes(x=TS, y=price, group=stock))+geom_line(aes(colour=stock)) # custom pallet custom_pal <- c("#002776", "#81BC00", "#00A1DE", "#72C7E7", "#3C8A2E", "#BDD203", "#313131", "#335291", "#9AC933", "#33B4E5", "#8ED2EC", "#63A158", "#CADB35", "#575757", "#4C689F", "#A7D04C", "#4CBDE8", "#9DD8EE", "#76AD6D", "#D1DF4F", "#8C8C8C", "#7F93BA", "#C0DE80", "#80D0EE", "#B8E3F3", "#9DC496", "#DEE881", "#B4B4B4", "#99A9C8", "#CDE499", "#99D9F2", "#C7E9F5", "#B1D0AB", "#E5ED9A", "#DCDCDC") # the function the change colours change_colours <- function(ggplot_obj, pal){ p <- ggplot_obj group_data <- p$data[, as.character(p$mapping$group)] n_groups <- length(unique(group_data)) group_data_cols <- pal[group_data] p + theme_light()+ geom_line(colour=group_data_cols) } p p1 <- change_colours(ggplot_obj=p, pal=custom_pal) p1

Espero cambiar la función change_colours() para que sea más genérica para todas las capas de tipo geom_*

Cualquier ayuda sería muy apreciada.