tutorial - ggplot: ¿Cómo establecer el color predeterminado para todos los geoms?
manual ggplot2 (2)
Para reemplazar una estética predeterminada de geom con otra (para todos los geom que usen esa estética), puede probar el siguiente código.
Primero defina una función para obtener la configuración aes predeterminada de todos los geoms desde ggplot2
library(ggplot2)
library(purrr)
geom_aes_defaults <- function() {
geom_names <- apropos("^Geom", ignore.case = FALSE)
geoms <- mget(geom_names, env = asNamespace("ggplot2"))
map(geoms, ~ .$default_aes)
}
Con geom_aes_defaults()
obtiene una larga lista de todas las asignaciones estéticas de geom
$Geom
Aesthetic mapping:
<empty>
$GeomAbline
Aesthetic mapping:
* `colour` -> "black"
* `size` -> 0.5
* `linetype` -> 1
* `alpha` -> NA
$GeomAnnotationMap
Aesthetic mapping:
* `colour` -> "NA"
* `fill` -> "grey20"
* `size` -> 0.5
* `linetype` -> 1
* `alpha` -> NA
$GeomArea
Aesthetic mapping:
* `colour` -> NA
* `fill` -> "grey20"
* `size` -> 0.5
* `linetype` -> 1
* `alpha` -> NA
...
La siguiente función recorre todos los geoms que coinciden con una estética determinada y sustituye los valores correspondientes
replace_geom_aes_defaults <- function(name, old_aes, new_aes) {
matching_geoms <-
map(geom_aes_defaults(), name) %>%
compact() %>%
keep(~ . == old_aes)
geoms <- gsub("^Geom(.*)", "//1", names(matching_geoms))
walk(geoms, update_geom_defaults, setNames(list(new_aes), name))
}
Ahora puede reemplazar los colores sistemáticamente, por ejemplo, convertir el negro en rojo por
replace_geom_aes_defaults("colour", "black", "red")
o incluso reemplazar colores de relleno (para gráficos de barras) por
replace_geom_aes_defaults("fill", "grey35", "red")
Estoy intentando establecer el color predeterminado para todos los geoms en un ggplot a algo que no sea negro. Tenga en cuenta que esto no se trata de establecer scale_color ...
Ejemplo simple:
# linear model with confidence bands...
set.seed(1)
df <- data.frame(x=1:50, y=5 + 2*(1:50)+rnorm(50,sd=10))
lm <- lm(y~x,df)
se <- summary(lm)$sigma # standard error of fit
Z <- qnorm(0.05/2,lower.tail=F) # 95% confidence bands
df <- cbind(df,predict(lm,se.fit=T)[c("fit","se.fit")])
# plot the result...
library(ggplot2)
ggplot(df, aes(x=x)) +
geom_point(aes(y=y), size=3) +
geom_line(aes(y=fit)) +
geom_line(aes(y=fit+Z*se.fit), linetype=2)+
geom_line(aes(y=fit-Z*se.fit), linetype=2)
Ahora, supongamos que quiero hacer todo rojo. Dejando de lado la conveniencia de hacer eso, creo que ggplot(df, aes(x=x), colour="red")
lo haría. Pero el parámetro colour=
parece ser ignorado: todo sigue siendo negro. Puedo agregar colour="red"
a cada llamada geom_
, pero estoy tratando de evitar eso.
Edición: el uso de ggplot(df, aes(x=x, color="red"))
no es una opción porque crea una escala de color con la paleta de ggplot predeterminada ( espaciada uniformemente alrededor de un círculo de color HSL ). Con un color, este es #F8766D
, que es rojo claro. Además, esto crea una leyenda que luego se debe ocultar.
Puede establecer un color predeterminado para cada tipo de geometría de esta manera:
update_geom_defaults("point", list(colour = "red"))
update_geom_defaults("line", list(colour = "red"))
ggplot(df, aes(x=x)) +
geom_point(aes(y=y), size=3) +
geom_line(aes(y=fit)) +
geom_line(aes(y=fit+Z*se.fit), linetype=2)+
geom_line(aes(y=fit-Z*se.fit), linetype=2)
Editar Si quiere hacer todo, entonces use (Editar préstamo desde here ):
params <- ls(pattern = ''^geom_'', env = as.environment(''package:ggplot2''))
geoms <- gsub("geom_", "", params)
lapply(geoms, update_geom_defaults, list(colour = "red"))
lapply(geoms, update_geom_defaults, list(fill = "red", colour = "red")) ## include fills
Si desea establecer el color predeterminado para el único gráfico, simplemente haga lo siguiente:
ggplot(df, aes(x=x, colour="red")) +
geom_point(aes(y=y), size=3) +
geom_line(aes(y=fit)) +
geom_line(aes(y=fit+Z*se.fit), linetype=2)+
geom_line(aes(y=fit-Z*se.fit), linetype=2)