ggplot2高级:使用ggproto构建自己的图层(四)

创建你自己的主题

如果你需要创建自己的完整主题,有以下几个件事情你需要知道

  • 重写已有的元素,而不是修改他们
  • 四个全局性元素影响几乎所有其他主题元素
  • 完整和不完整元素的比较

重写元素

默认情况下,当你新增一个主题元素,它会从一个已有主题中继承参数值。例如,如下的代码设置key颜色是红色,但它继承了已有的fill颜色。

theme_grey()$legend.key
#> List of 5
#>  $ fill         : chr "grey95"
#>  $ colour       : chr "white"
#>  $ size         : NULL
#>  $ linetype     : NULL
#>  $ inherit.blank: logi TRUE
#>  - attr(*, "class")= chr [1:2] "element_rect" "element"

new_theme <- theme_grey() + theme(legend.key = element_rect(colour = "red"))
new_theme$legend.key
#> List of 5
#>  $ fill         : chr "grey95"
#>  $ colour       : chr "red"
#>  $ size         : NULL
#>  $ linetype     : NULL
#>  $ inherit.blank: logi FALSE
#>  - attr(*, "class")= chr [1:2] "element_rect" "element"

为了将其彻底重写,使用%+replace%而不是+:

new_theme <- theme_grey() %+replace% theme(legend.key = element_rect(colour = "red"))
new_theme$legend.key
#> List of 5
#>  $ fill         : NULL
#>  $ colour       : chr "red"
#>  $ size         : NULL
#>  $ linetype     : NULL
#>  $ inherit.blank: logi FALSE
#>  - attr(*, "class")= chr [1:2] "element_rect" "element"

全局元素

有四个元素会影响绘图中的全局表现

Element Theme function Description
line element_line() all line elements
rect element_rect() all rectangular elements
text element_text() all text
title element_text() all text in title elements (plot, axes & legend)

很多特殊设置继承下来的属性都可以被以上这四个属性所修改。这对于修改整体背景颜色和总体字体非常有用。

df <- data.frame(x = 1:3, y = 1:3)
base <- ggplot(df, aes(x, y)) + 
  geom_point() + 
  theme_minimal()

base
base

修改整体的字体颜色(不包括坐标)

base + theme(text = element_text(colour = "red"))
base-text-red

建议在创建主题的起步阶段,先从修改这些值开始。

完整和不完整的比较

你需要理解完整主题对象不完整主题对象之间的区别。一个完整的主题对象,就是一个主题函数中设置了complete=TRUE

theme_grey()theme_bw()为例,他们就是完整的主题对象。而调用theme()则会得到一个不完整的主题对象。这两个区别在于,前者是对整体的修改,而后者只是修改了部分的元素。

attr(theme_grey(), "complete")
# [1] TRUE
attr(theme(), "complete")
# [1] FALSE

如果在一个完整对象上加上一个不完整对象,那么结果是一个完整对象

theme_test <- theme_grey() + theme()
attr(theme_test(), "complete")
# [1] TRUE

完整主题和不完整主题在添加到ggplot对象上有一些差别

  • 在当前主题对象上增加一个不完整的主题对象,只会修改在theme()中定义的元素。
  • 而在当前主题对象上增加一个完整主题对象,则会将已有主题完全覆盖成新的主题。

版权声明:本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。

扫码即刻交流

你可能感兴趣的:(ggplot2高级:使用ggproto构建自己的图层(四))