ggplot:如何设置所有geoms的默认颜色?

时间:2014-01-16 22:55:35

标签: r ggplot2

我正在尝试将ggplot中所有geom的默认颜色设置为黑色以外的其他颜色。请注意,这是关于设置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_,但我正在努力避免这种情况。

修改 使用ggplot(df, aes(x=x, color="red"))不是一个选项,因为它使用默认的ggplot调色板(evenly spaced around an HSL color circle)创建颜色比例。使用一种颜色,这是#F8766D,恰好是浅红色。此外,这会创建一个必须隐藏的图例。

2 个答案:

答案 0 :(得分:26)

您可以通过以下方式为每种几何体类型设置默认颜色:

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)

修改  如果你想做所有事情,那么使用(编辑借用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 

如果您只想为一个图设置默认颜色,只需执行以下操作:

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)

答案 1 :(得分:0)

要用另一种默认几何图形(对于使用该美学的所有几何图形)替换,可以尝试以下代码。

首先定义一个函数,用于从 ggplot2

获取所有几何的默认aes设置
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")