ggplot2 美化 背景/主题(theme)
英文中使用theme一词,但感觉翻译为背景、主题均可,自己习惯称为背景,下文中尽可能统一为
“主题”一词。
基本概念
ggplot2的theme()函数可以实现对非数据元素的调整;绘图时,首先确定数据如何展示,之后再
通过theme()对结果进行渲染,使之更加美观。
标度
通过labs{ggplot2}等函数进行修改,此处不做展开。
内置主题
本身有8种内置的主题(theme);通过 theme_主题名() 进行调用,下方是对各类主题的介绍[1]:
- theme_grey() 默认背景,浅灰色背景和白色网格线,无边框;
- theme_bw() 类似默认背景,调整为白色背景和浅灰色网格线,无边框;
- theme_linedraw() 白色背景和黑色网格线,黑色边框线;
- theme_light() 白色背景和浅灰色网格线,浅灰色边框;
- theme_dark() 灰黑色背景和灰色网格线,灰色/无边框;
- theme_minimal() 白色背景和浅灰色网格线,无边框;
- theme_classic() 类似R本身绘图的风格;
- theme_void() 完全空白
主题名背景色网格线边框刻度线坐标轴说明
grey 浅灰白色白色黑色无
默
认,ggplo
t2标志性
主题
bw 白色浅灰黑色黑色无
适合投影
仪展示
linedraw 白色
黑色
(细)
黑色
(粗)
黑色无
只有白色
背景和不
同粗细的
黑色线
条;因为
有非常细
的线条
(<<1pt
)可能会
被一些期
刊拒绝
light 白色浅灰浅灰浅灰无
线条全为
浅灰色
dark 灰色深灰深灰黑色无
采用鲜艳
的配色为
数据上色
时推荐,
有突出效
果
minimal 白色浅灰无浅灰无
符合
ggplot2审
美的极简
主题
classic 白色无无黑色黑色
类似R本身
绘图的风
格
void 白色/无无无无无啥都没有
具体的图像可以参考这个网页18 Themes | ggplot2 (ggplot2-book.org)。但是其中的图像较
小,可以复制代码后自己运行。
其他主题包
由Jeffrey Arnold 开发的ggthemes包,提供更多的主题选择,当然在期刊投稿的时候可能不是很
推荐。
比如其中有常见的solarized主题(一种暖色调的护眼主题,常见于各类IDE中,Rstudio也推荐此
类主题,虽然自己本身比较讨厌黄色)和放excel的主题。
自制/修改主题
可以将theme()部分保存为变量,以重复调用;
SelfTheme <‐ theme(…)
ggplot变量 + SelfTheme
此外,有一系列的theme_改动()的函数,但是使用起来与help文档中的介绍无法对应;具体如
下:
theme_set(主题名/自己折腾的主题变量) 相当于设置默认使用的主题;
theme_update() 或 theme_replace() 分别对应覆写或替代,将后面的参数覆写或替代原主题的相
关信息,具体区别见帮助文档;
theme_get() 没搞明白,疯了,什么东西这是
help文档中对应介绍:Use theme_get() to get the current theme……
微调
这一部分对应下面代码中“element_功能()”部分,前面的组间见下一部分"组件"
在选定主题的基础上,可以通过theme函数以“覆盖”[2]某些组件的方式进行调整。具体的格式
为:
这里需要修改的部分用中文代替,其他为英文(英文字符,所以复制后只需要替换掉中文部分即可)
ggplot变量 + theme(组件 = element_功能())
组件对应替换为类似 plot.title 的格式|具体见“微调”后面对应的“组件”部分。
功能见下文。
原文为
plot + theme(element.name = element_function()) # 但是element.name部分是如plot.tltle的格式
功能有4个基本类型,包括文字(text),线条(line),矩形(rectangle),空白(blank)。
各有一系列控制外观的参数:
text
element_text() 对应标签和标题;其中参数包括:
• family = “字体名”| 字体
• colour = “颜色单词”| 颜色
• size = 数值 | 大小,单位是磅(point)
• hjust = 数值 | 好像有范围,1对应右侧靠边
• vjust = 数值 | 同上
• angle = 数值 | 单位是度,采用角度制,不要用弧度制(国内应该不至于)
• lineheight = 待定 | 行高,与fontcase的比例,这个在word中就没搞明白,欢迎补充
“Setting the font face is particularly challenging.”——from 该章节作者
• mergin = mergin(t=数值, r=数值, b=数值, l=数值) | 控制字体周围边距,默认值为0,四个字
母分别对应top、right、bottom和left。
具体代码为
ggplot变量 + theme(plot.title = element.text(……)) # 修改图表名
ggplot变量 + theme(axis.title.x = element.text(……)) # 修改图表名
line
element_line()绘制线条,参数有:
• colour = “颜色单词”| 颜色
• size = 数值 | 大小
• linetype = “单词” | 线条类型,具体参看help文档
具体代码为:
ggplot变量 + theme(panel.grid.major = element.line(……)) # 修改网格线
rect
element_rect()绘制背景矩形(图像整体外围的部分),具体参数有:
• fill = “颜色单词”| 图像外围的颜色
• colour = “颜色单词”| 整体边框的颜色
• size = 数值 | 边框的粗细
• linetype = “单词” | 线条类型,具体参看help文档
ggplot变量 + theme(plot.background = element.rect(……)) # 修改背景矩形
blank
element_blank() 不绘制任何东西,并取消相应组间的空间。
unit
用于设定网格单位,如unit(1,“cm”)或unit(0.25,“in”)
组件
此部分对应下面代码的组件部分。
ggplot变量 + theme(组件 = element_功能())
图像组件
组件对应的element_功能() 描述
plot.background element_rect() 图像背景
plot.title element_text() 图像标题
plot.margin margin() 图像边距
plot.background=element_rect(fill = NA)可以将背景矩形设为透明。
如果要绘制边框,应该至少保留一个微小的边距。
坐标轴组件
轴线处理,默认是隐藏的。
组件对应的element_功能() 描述
axis.line element_line() 轴线
坐标轴标签
有下方三种形式,如果一次性修改两个坐标轴,应选择第一种形式;所有没有在.x和.y设置的属
性,都会从axis.text中继承。
对于长标签,可以设置element_text(angle=-90, vjust=0.5)来避免标签间的重叠;或者其他的负
数角度值和hjust=0,vjust=1的组合。
组件对应的element_功能() 描述
axis.text element_text() 坐标轴标签
axis.text.x element_text() x轴标签
axis.text.y element_text() y轴标签
坐标轴标题
有下方三种形式,如果一次性修改两个坐标轴,应选择第一种形式;所有没有在.x和.y设置的属
性,都会从axis.title中继承。
组件对应的element_功能() 描述
axis.title element_text() 坐标轴标题
axis.title.x element_text() x轴标题
axis.title.y element_text() y轴标题
轴须组件
组件对应的element_功能() 描述
axis.ticks element.line() 轴须标签
axis.ticks.length unit() 轴须标签的长度
图例组件
首先其他诸如guide_legend()或guide_colourbar()等函数也可以用来修改图例。以及向
legend.position\legend.direction\legend.justification\legend.box等属性控制图例在图像中的
布局。
组件对应的element_功能() 描述
legend.background element_rect() 图例背景
发布于 2022-01-30 16:06
legend.key element_rect() 图例符号背景
legend.key.size unit() 图例符号大小
legend.key.height unit() 图例符号高度
legend.key.width unit() 图例符号宽度
legend.margin unit() 图例边距
legend.text element_text() 图例标签
legend.text.align 0-1 图例标签对齐(0=右,1=左)
legend.title element_text() 图例名
legend.title.align 0-1 图例名对齐(0=右,1=左)
面板组件
对应控制图像的外观
组件对应的element_功能() 描述
panel.background element_rect() 面板背景(数据下面)
panel.border element_rect() 面板边界(数据上面)
panel.grid.major element_line() 主网格线
panel.grid.major.x element_line() 竖直主网格线
panel.grid.major.y element_line() 水平主网格线
panel.grid.minor element_line() 次网格线
panel.grid.minor.x element_line() 竖直次网格线
panel.grid.minor.y element_line() 水平次网格线
aspect.ratio 数值(m/n,两个整数) 图像宽高比
panel.background与panel.border不同主要为前者绘制在数据的下面一层;后者绘制在数据上面
一层;因此覆盖panel.border时需要设定fill=NA。
分面组件
绘制多个图像时使用,没用过,简单整理。
组件对应的element_功能() 描述
strip.background element_rect() 分面标签背景
strip.text element_text() 条状文本
strip.text.x element_text() 水平条状文本
strip.text.y element_text() 竖直条状文本
panel.spacing unit() 分面间边距
panel.spacing.x unit() 竖直分面间边距
panel.spacing.y unit() 水平分面间边距
参考 - ^ https://ggplot2.tidyverse.org/reference/ggtheme.html
- ^ 后面的代码会修改前面已有的设置