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.