Подтвердить что ты не робот

Ggplot: Как установить цвет по умолчанию для всех геометров?

Я пытаюсь установить цвет по умолчанию для всех геометров в ggplot для чего-то другого, кроме черного. Обратите внимание, что речь идет не о настройке scale_color...

Простой пример:

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

Теперь, предположим, я хочу сделать все красным. Оставив в стороне целесообразность этого, я бы подумал, что ggplot(df, aes(x=x), colour="red") сделает это. Но параметр colour=, кажется, игнорируется: все по-прежнему остается черным. Я могу добавить colour="red" к каждому вызову geom_, но я пытаюсь избежать этого.

Edit: Использование ggplot(df, aes(x=x, color="red")) не является параметром, поскольку оно создает цветовую шкалу с использованием палитры ggplot по умолчанию (равномерно распределенной вокруг круга цветов HSL). С одним цветом это #F8766D, что бывает светло-красным. Кроме того, это создает легенду, которая затем должна быть скрыта.

4b9b3361

Ответ 1

Вы можете установить цвет по умолчанию для каждого типа геометрии следующим образом:

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)

Edit  Если вы хотите сделать все, то используйте (Edit заимствуйте здесь):

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 

Если вы хотите установить цвет по умолчанию только для одного графика, просто выполните:

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)

Ответ 2

Чтобы заменить стандартную эстетику geom другой (для всех geom, использующих эту эстетику), вы можете попробовать следующий код.

Сначала определите функцию для получения настроек aes по умолчанию для всех geoms из 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)
}

С помощью geom_aes_defaults() вы получаете длинный список всех отображений эстетики геома.

$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

...

Следующая функция перебирает все геометрии, соответствующие данной эстетике, и подставляет соответствующие значения

replace_geom_aes_defaults <- function(name, old_aes, new_aes) {
  matching_geoms <- 
    map(geom_aes_defaults(), name) %>%
      compact() %>%
      keep(~ !is.na(.) & . == old_aes)
  geoms <- gsub("^Geom(.*)", "\\1", names(matching_geoms))
  walk(geoms, update_geom_defaults, setNames(list(new_aes), name))
}

Теперь вы можете заменить цвета систематически, например, превратить черный в красный

replace_geom_aes_defaults("colour", "black", "red")

или даже заменить цвета заливки (для гистограммы) на

replace_geom_aes_defaults("fill", "grey35", "red")