Tidyverse自学笔记-ggplot2之主题

ggplot2绘图时首先确定数据如何展示,然后再用主题系统对细节进行渲染。主题系统包括绘图区的背景、网格线、坐标轴线条等图表细节部分。主题是由控制图形外观的多个元素构成的。
主题设置可分为两种:
全局设置:theme_set(theme_bw())。
局部设置:ggplot() + theme_bw(),只改变单个图形的主题。个人认为,主题设置可通过三种方式实现:

1、使用内置主题;2、使用主题相关的包;3、用户自定义主题。

1、内置主题

ggplot2提供了8种内置主题。
theme_gray():默认主题,浅灰色背景,白色网格线,无边框。
theme_bw():白色背景,浅灰色网格线,黑色边框。
theme_linedraw():白色背景,黑色网格线,黑色边框。
theme_light():白色背景,浅灰色坐标轴,浅灰色网格线,浅灰色边框。
theme_dark():灰黑色背景,灰色网格线,无边框。
theme_minimal():白色背景,浅灰色网格线,无坐标轴,无边框。theme_classic():白色背景,无网格线,无边框。theme_void():完全空白,只显示几何对象。

data1 <- read_csv(file = "data1.csv") # 导入数据。
## Rows: 48 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): nitrogen, variety
## dbl (4): year, block, v1, v2
##
## ℹ Use `spec()` to retrieve the full column specification for this data.## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ggplot(data1, aes(v1, v2)) + geom_point() # 默认主题。
ggplot(data1, aes(v1, v2)) + geom_point() + theme_bw() # theme_bw()主题。
ggplot(data1, aes(v1, v2)) + geom_point() + theme_linedraw() # theme_linedraw()
ggplot(data1, aes(v1, v2)) + geom_point() + theme_light() # theme_light()
ggplot(data1, aes(v1, v2)) + geom_point() + theme_dark() # theme_dark()
ggplot(data1, aes(v1, v2)) + geom_point() + theme_minimal() # theme_minimal()
ggplot(data1, aes(v1, v2)) + geom_point() + theme_classic() # theme_classic()
ggplot(data1, aes(v1, v2)) + geom_point() + theme_void() # theme_void()

2、使用主题相关的包

类似的包有ggthemes、ggthemer、ggtech、ggsci、ggprism、ggpubr、ggThemeAssist等,ggThemeAssist包安装后,可在Rstudio中实现鼠标操作设置主题。这里以ggprism和ggpubr包为例。

ggplot(data1, aes(nitrogen, v1, fill = nitrogen)) + geom_boxplot() # ggplot2箱线图。
library(ggprism) # 调用ggprism包。
ggplot(data1, aes(nitrogen, v1, fill = nitrogen)) + geom_boxplot() + theme_prism() # graphpad prism主题风格的箱线图。
library(ggpubr) # 调用ggpubr包。
ggplot(data1, aes(nitrogen, v1, fill = nitrogen)) + geom_boxplot() + theme_pubr() # 使用ggpubr包中的theme_pubr主题。

3、用户自定义主题

通过theme()函数参数修改,确定自己喜欢的主题,可以保存为变量,以后方便重复调用。

theme(
line,
rect,
text,
title,
aspect.ratio,
axis.title,
axis.title.x,
axis.title.x.top,
axis.title.x.bottom,
axis.title.y,
axis.title.y.left,
axis.title.y.right,
axis.text,
axis.text.x,
axis.text.x.top,
axis.text.x.bottom,
axis.text.y,
axis.text.y.left,
axis.text.y.right,
axis.ticks,
axis.ticks.x,
axis.ticks.x.top,
axis.ticks.x.bottom,
axis.ticks.y,
axis.ticks.y.left,
axis.ticks.y.right,
axis.ticks.length,
axis.ticks.length.x,
axis.ticks.length.x.top,
axis.ticks.length.x.bottom,
axis.ticks.length.y,
axis.ticks.length.y.left,
axis.ticks.length.y.right,
axis.line,
axis.line.x,
axis.line.x.top,
axis.line.x.bottom,
axis.line.y,
axis.line.y.left,
axis.line.y.right,
legend.background,
legend.margin,
legend.spacing,
legend.spacing.x,
legend.spacing.y,
legend.key,
legend.key.size,
legend.key.height,
legend.key.width,
legend.text,
legend.text.align,
legend.title,
legend.title.align,
legend.position,
legend.direction,
legend.justification,
legend.box,
legend.box.just,
legend.box.margin,
legend.box.background,
legend.box.spacing,
panel.background,
panel.border,
panel.spacing,
panel.spacing.x,
panel.spacing.y,
panel.grid,
panel.grid.major,
panel.grid.minor,
panel.grid.major.x,
panel.grid.major.y,
panel.grid.minor.x,
panel.grid.minor.y,
panel.ontop,
plot.background,
plot.title,
plot.title.position,
plot.subtitle,
plot.caption,
plot.caption.position,
plot.tag,
plot.tag.position,
plot.margin,
strip.background,
strip.background.x,
strip.background.y,
strip.placement,
strip.text,
strip.text.x,
strip.text.y,
strip.switch.pad.grid,
strip.switch.pad.wrap,
…, complete = FALSE,validate = TRUE)

根据作用对象,参数包括以下方面:

  • axis.xxxx类,针对图形坐标轴,常见的有。
    axis.ticks = element_line() 坐标轴刻度;
    axis.title = element_text() 坐标轴标题;
    axis.text = element_text() 坐标轴标签;axis.line = element_line() 直线和坐标轴;

  • legend.xxxx类,针对图形图例,常见的有。
    legend.background = element_rect() 图例背景;
    legend.key = element_rect() 图例符号;
    legend.text = element_text() 图例标签;
    legend.title = element_text() 图例标题;
    legend.margin = margin() 图例边距;legend.position = “top”, “bottom”, “left”, “right” 图例位置。

  • panel.xxxx类,针对图形面板,常见的有。
    panel.background = element_rect() 面板背景;
    panel.grid = element_line() 面板网格线;panel.border = element_rect() 面板边界。

  • plot.xxxx类,针对图形整体,常见的有。
    plot.background = element_rect() 整个图形背景;
    plot.title = element_text() 图形标题;plot.margin = margin() 图形边距。

  • strip.xxxx类,针对图形分面,常见的有。
    strip.background = element_rect() 分面标签背景;
    strip.text = element_text() 条带文本;panel.spacing = unit() 分面间隔。

  • ggplot2主题系统的主要对象包括文本、线条和矩形,对应的函数有element_text()、element_line()、element_rect()、element_blank()。

  • element_text():图形文本调节,包括图形、轴、图例标题和标签等,可控制图形标题或标签字的family,face,colour,size,hjust,vjust,angle,lineheight。ggplot2成图默认基础字体大小指的是轴标题大小,图形标题比它大20%,轴标签比它小20%。
    plot.title 图形标题;
    axis.title 轴标题;
    axis.text 轴标签;legend.text 轴标签。

  • ggplot(data1, aes(v1, v2, color = nitrogen)) + geom_point() + 
    labs(title = "This is title") +
    theme(plot.title = element_text(size = 20, color = "red", face = "italic", family = "serif", hjust = 0.5, vjust = 0.5, angle = 10),
    axis.title = element_text(colour = "blue"),
    axis.text = element_text(color = "green"), legend.text = element_text(color = "orange")) # 图形文本元素修改。

  • element_line():绘制线条或线段,可控制fill,colour,size,linetype。
    panel.grid.major 控制主网格线;
    panel.grid.minor 控制次要网格线;
    panel.grid.major.x or y 控制主网格线水平或垂直参数。
    axis.line 调节轴线参数;axis.ticks 调节轴刻度参数。

  • ggplot(data1, aes(v1, v2)) + geom_point() + 
    theme(panel.grid.major = element_line(size = 1, color = "blue", linetype = "dotted"),
    panel.grid.minor = element_line(size = 1, color = "green", linetype = "dotted"),
    axis.line = element_line(size = 1, color = "red", linetype = "dashed"), axis.ticks = element_line(size = 3, color = "purple")) # 图形主题线元素修改。
    ggplot(data1, aes(v1, v2)) + geom_point() + theme(panel.grid.minor.x = element_line(size = 1, color = "green", linetype = "dotted")) # 主网格线垂直线参数设定。
    ggplot(data1, aes(v1, v2)) + geom_point() + theme(panel.grid.major.y = element_line(size = 1, color = "blue", linetype = "dotted")) # 主网格线水平线参数设定。
    ggplot(data1, aes(v1, v2)) + geom_point() + theme(panel.grid.minor.x = element_line(size = 1, color = "blue", linetype = "dotted")) # 次要网格线垂直线参数设定。
    ggplot(data1, aes(v1, v2)) + geom_point() + theme(panel.grid.minor.y = element_line(size = 1, color = "blue", linetype = "dotted")) # 次要网格线水平线参数设定。

  • element_rect():绘制供背景使用的矩形。可控制fill,colour,size,linetype。
    plot.background 图形背景;
    plot.margin 图形边界;
    panel.background 面板背景;
    panel.border 面板边界;
    legend.background 图例背景;legend.margin 图例边界。

  • ggplot(data1, aes(v1, v2, colour = nitrogen)) + geom_point() + theme(plot.background = element_rect(fill = "pink", size = 1, color = "blue", linetype = "dotted"), panel.background = element_rect(fill = "lightblue", size = 1, color = "red", linetype = "dashed"), legend.background = element_rect(fill = "brown", linetype = "dotted"), plot.margin = margin(t = 10, r = 20, b = 10, l = 20, unit = "pt"), legend.margin = margin(t = 10, r = 20, b = 10, l = 20, unit = "pt"))  # 图形背景矩形主题元素修改。plot.background针对整个图形背景,panel.background针对图形面板。

  • element_blank():表示空主题,即对元素不分配相应的绘图空间。colour=NA,fill=NA虽可删除绘图元素,但仍占绘图空间。

  • ggplot(data1, aes(v1, v2)) + geom_point() + theme(panel.grid =  element_blank(), axis.title.x = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black")) # 图形主题元素删除。panel.grid去除了图形背景,axis.title.x去除了x轴标题。

    下面,自己构造一个主题mytheme,小试牛刀一下。使用自定义主题的好处是,以后使用ggplot2绘制图形时可方便、快捷地将自定义的主题应用到绘制的图形中。

    mytheme <- theme_bw() + theme(plot.title = element_text(size = 20, color = "red", face = "italic", family = "serif", hjust = 0.5, vjust = 0.5), axis.title = element_text(size = 15, color = "blue", face = "bold", family = "serif"), axis.text = element_text(size = 10, color = "green", face = "italic", family = "serif")) + theme(panel.grid = element_blank()) + theme(panel.background = element_rect(fill = "lightblue")) # 自定义主题mytheme。ggplot(data1, aes(x = nitrogen, y = v1, fill = nitrogen)) + geom_boxplot() + labs(title = "我的示例图形") + mytheme # 使用自定义主题。

    参考资料

    1. ggplot2 | 图例(Ⅰ):图例函数、主题函数中的图例参数,https://zhuanlan.zhihu.com/p/404747027

    2. R|ggplot2(六)|套用主题模板,https://zhuanlan.zhihu.com/p/29656775

    3. ggplot2: 数据分析与图形艺术,西安交通大学出版社,2013.

    4.《R数据科学》,人民邮电出版社,2018.

    本文使用 文章同步助手 同步

    你可能感兴趣的:(Tidyverse自学笔记-ggplot2之主题)