创建你自己的主题
如果你需要创建自己的完整主题,有以下几个件事情你需要知道
- 重写已有的元素,而不是修改他们
- 有四个全局性元素影响几乎所有其他主题元素
- 完整和不完整元素的比较
重写元素
默认情况下,当你新增一个主题元素,它会从一个已有主题中继承参数值。例如,如下的代码设置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 + theme(text = element_text(colour = "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) 进行许可。