本篇推文来介绍图形的注释功能。在基础绘图系统中,注释功能主要由次级函数来实现,如text()
函数可以添加文本、mtext()
函数添加轴标签、segments()
添加短线、arrows()
函数添加箭头、rect()
函数添加矩形等。而在ggplot2
绘图系统中,一方面可以使用一些几何图形函数、统计变换函数充当注释函数,另一方面它还有专门的注释函数annotate()
。
library(ggplot2)
library(patchwork)
p <- ggplot(mtcars, aes(x = wt, y = mpg, col = vs)) +
geom_point() + theme_bw() +
theme(legend.position = "none",
axis.text = element_text(size = 15),
axis.title = element_text(size = 18))
p

1 文本注释
文本注释是比较常用的注释方法。
1.1 geom_text()
geom_text()
函数的功能类似于基础绘图系统的text()
函数,它属于gpglot2
绘图系统中的几何图形函数,遵循该类函数的使用规则。语法结构如下:
geom_text(
mapping = NULL,
data = NULL,
stat = "identity",
position = "identity",
...,
parse = FALSE,
nudge_x = 0,
nudge_y = 0,
check_overlap = FALSE,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE
)
mapping:映射参数;
data:映射变量所在的数据框,默认使用全局数据框。
geom_text()
函数可用于映射的美学参数(aesthetics):x、y、label、alpha、angle、colour、family、fontface、group、hjust、lineheight、size、vjust;其中label为必须参数。
p + geom_text(aes(label = vs, vjust = 1, hjust = "outward"))

parse:逻辑型参数;若设为TRUE,则
label
参数的内容遵循plotmath
的编译规则,具体见推文grDevices | 如何在图形中使用数学表达式作为标注文本;nudge_x、nudge_y:偏移量;与
vjust
和hjust
参数不同的是,它的单位和对应坐标轴的刻度相同;check_overlap:逻辑型参数;若设为TRUE,则重叠的文本注释会被去除。
p + geom_text(aes(label = vs, vjust = 1, hjust = "outward"),
check_overlap = T)

1.2 geom_label()
geom_label()
函数也可以添加文本作为注释,但效果与geom_text()
函数不同。它的语法结构如下:
geom_label(
mapping = NULL,
data = NULL,
stat = "identity",
position = "identity",
...,
parse = FALSE,
nudge_x = 0,
nudge_y = 0,
label.padding = unit(0.25, "lines"),
label.r = unit(0.15, "lines"),
label.size = 0.25,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE
)
示例如下:
p + geom_label(aes(label = vs), nudge_x = 0.25)

label.padding:标签文本与外框的距离大小;
label.r:外框圆角的半径;
label.size:外框线条的尺寸,单位为毫米(mm)。
p + geom_label(aes(label = vs), nudge_x = 0.15,
label.padding = unit(0.1, "lines"),
label.r = unit(0.05, "lines"),
label.size = 0.1)

2 annotate()
annotate()
函数的语法结构如下:
annotate(
geom,
x = NULL,
y = NULL,
xmin = NULL,
xmax = NULL,
ymin = NULL,
ymax = NULL,
xend = NULL,
yend = NULL,
...,
na.rm = FALSE
)
annotate()
函数可以通过geom
参数调用相关的几何图形函数的绘图效果,并将控制绘图区域的参数统一命名为x、y、xmin、xmax、ymin、ymax、xend、yend,...
表示针对几何图形函数的特殊参数。
比如,文本注释大多数情况下并需要针对所有点进行,这时使用annotate()
函数要比geom_text()
或geom_label()
函数快捷、方便的多:
p1 <- p + annotate("text", x = c(2, 5), y = c(15, 25),
label = c("标签1", "标签2"))
p2 <- p + annotate("label", x = c(2, 5), y = c(15, 25),
label = c("标签1", "标签2"))
p1 + p2

调用geom_rect()
函数的绘图功能:
p + annotate("rect", xmin = 2.5, xmax = 3.5,
ymin = 15, ymax = 25,
alpha = 0.3)

多种注释进行组合:
p + annotate("rect", xmin = 2.5, xmax = 3.5,
ymin = 15, ymax = 25,
alpha = 0.3) +
annotate("segment", x = 3.5, xend = 4, y = 25, yend = 30) +
annotate("label", x = 4, y = 30, label = "注释")

3 annotation_
函数
3.1 annotation_custom()
该函数通过嵌套其他图形来为图形做注释,它的语法结构如下:
annotation_custom(
grob,
xmin = -Inf, xmax = Inf,
ymin = -Inf, ymax = Inf)
grob:作为嵌套的图形;
xmin、xmax、ymin、ymax:嵌套图形放置的区域。
嵌套图形需要先使用
ggplot2
绘图系统进行绘制,再使用ggplotGrob()
函数进行封装。
g <- ggplot(mtcars, aes(x = factor(cyl))) + geom_bar() +
theme_bw() + scale_x_discrete(name = "cyl")
g <- ggplotGrob(g)
p + annotation_custom(g, xmin = 3.5, xmax = 5.5,
ymin = 20, ymax = 35)

3.2 annotation_logticks()
该函数为图形的坐标轴添加对数刻度线。语法结构如下:
annotation_logticks(
base = 10,
sides = "bl",
outside = FALSE,
scaled = TRUE,
short = unit(0.1, "cm"),
mid = unit(0.2, "cm"),
long = unit(0.3, "cm"),
colour = "black",
size = 0.5,
linetype = 1,
alpha = 1,
color = NULL,
...
)
base:对数底数;
sides:对数刻度出现的位置;t、b、l、r分别表示上、下、左、右坐标轴,可使用字符串进行任意组合。
p + annotation_logticks(sides = "bt")
