ggplot2基础(3)——注释
ggplot2基础(1)
ggplot2基础(2)——坐标轴
ggplot2基础(3)——注释
ggplot2基础(4)——主题
ggplot2基础(5)——配色与图例
使用ggplot2过程中,离不开在其中添加各种各样的文字信息,对于坐标轴上的文字内容,可以使用的函数包括lab()
、xlab()
、ylab
等多个函数,我们已经在上一章中进行了详细的介绍,这一章我们主要介绍图中的其他文字标注方式——注释。
参考的内容主要是:
- 《R数据可视化手册》
- 《R绘图 第十篇:绘制文本、注释和主题(ggplot2)》
- 《R可视化05|ggplot2图层-注释图层(Annotation layer)》
- 《Create an annotation layer》
- 《8 Annotations》
1 annotate函数
如果想要在图片上添加注释,目前比较推荐的是使用annotate
函数,该函数会在图片上增加注释图层,该图层不会映射到DataFrame对象。其定义为:
annotate(
geom,
x = NULL,
y = NULL,
xmin = NULL,
xmax = NULL,
ymin = NULL,
ymax = NULL,
xend = NULL,
yend = NULL,
vjust,
hjust,
arrow = NULL,
parse = FALSE,
...,
na.rm = FALSE
)
其中
-
geom
注释的类型,可选项包括"text"
(文本)、"rect"
(矩形)、"segment"
(线段)、"pointrange"
(点线段)、"curve"
(曲线)等 -
x, y, xmin, ymin, xmax, ymax, xend, yend, vjust, hjust
注释所在的位置信息 -
arrow
设置箭头信息(只有注释类型为线段或曲线时起作用) -
parse
逻辑型参数;若设为TRUE,则label参数的内容遵循plotmath的编译规则 -
...
一些视觉参数,可以参考aes函数的设置 -
na.rm
默认值为FALSE,此时缺失的值会被移除,并会给出警告信息;如果设置为TRUE,则缺失值会被删除而不给出任何警告信息。
1.1 文本型注释——text
使用文本型注释,除了将geom
参数设置为text外,还需要设置label
参数:
library(ggplot2)
p = ggplot(faithful, aes(x=eruptions, y=waiting)) +
geom_point()
p + annotate("text", x=3, y=48, label="Group1") +
annotate("text", x=4.5, y=66, label="Group2")
如果坐标轴为连续值,则可以将x
、y
设置为Inf
或-Inf
,以便于在绘图区域的边缘放置注解。
p +
annotate("text", x=-Inf, y=Inf, label="Upper left", hjust=-.2, vjust=2) +
annotate("text", x= mean(range(faithful$eruptions)), y=-Inf, vjust=-0.4, label="Bottom middle")
此外,还可以在label中使用Latex公式(其实是plotmath),以实现公式的编辑(同时将parse
参数设置为TRUE)。如果需要在公式中使用普通的文字,则需要在其中将普通文字以单引号引起来,同时添加*
作为分隔。
p = ggplot(data.frame(x=c(-3, 3)), aes(x=x)) +
stat_function(fun=dnorm)
p + annotate("text", x=0, y=0.05, size=4, parse=TRUE, label="'Function:' * y==frac(1, sqrt(2 * pi)) * e^{-x^2/2}")
1.2 线型注释(含箭头)——segment、curve
如果要在图片中添加线段型注释,则需要将geom
设置为"segment",同时设置x
、y
、xend
、yend
,分别代表起点和终点的坐标
如果要为线段添加箭头,则需要设置arrow
参数
arrow
参数一般使用arrow()
函数来进行设置,其常用的参数有:
- ends 如果设置为
"both"
,则表示线段的两边均有箭头,否则只在线段的终端进行设置 - angel 箭头的角度,如果设置为90,则可以作为范围的标签进行使用
- length 箭头的长度,一般可以使用
unit(长度,"单位")
的形式来使用
更多的使用可以加载
grid
包后,用?arrow
命令来查看
p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point()
p + annotate("segment", x = 2.5, xend = 4, y = 15, yend = 25, color = "blue", size=4)
p <- ggplot(mpg, aes(displ, hwy)) +
geom_point(
data=filter(mpg, manufacturer=="subaru"),
color="orange",
size=3,
) +
geom_point()
p +
annotate(geom = "segment", x = 4, y = 35, xend = 2.65, yend = 27, arrow = arrow(length = unit(4, "mm")), size=2)+
annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
当需要使用更加美观的曲线时,需要将geom
设置为"curve"
,同时想要调整曲线的曲率,则可以调整curvature
参数。
p +
annotate(geom = "curve", x = 4, y = 35, xend = 2.65, yend = 27, curvature = .3, arrow = arrow(length = unit(4, "mm")), size=2)+
annotate(geom = "text", x = 4.1, y = 35, label = "subaru", hjust = "left", size=10)
1.3 阴影注释——rect
使用阴影注释(在图片中添加矩形方框),除了需要将geom
参数设置为"rect"
外,还需要设置好xmin
、ymin
、xmax
、ymax
,以便于确定矩形的范围。
ggplot(economics) +
geom_line(aes(date, unemploy)) +
annotate("rect",
xmin=as.Date("1970-01-01","%Y-%m-%d"),
xmax=as.Date("1979-12-31","%Y-%m-%d"),
ymin=-Inf, ymax=Inf, fill="blue", alpha=.1)+
xlab("date") +
ylab("unemployment")
2 其他注释
2.1 直线注释
前面提到的是线段注释,如果想要使用直线类型的注释,可选的选项包括:
- geom_hline()
- geom_vline()
- geom_abline()
其中geom_abline()的参数主要包括:
- slope 表示斜率
- intercept 表示截距
早期的ggplot中并未包含annotate函数,因此绝大多数使用的是直线、geom_rect等对象进行注释
library(ggplot2)
p = ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point()
p +
geom_hline(yintercept=25) +
geom_vline(xintercept=3) +
geom_abline(slope=3, intercept=20)
2.2 文字注释——geom_text与geom_label
使用geom_text()
和geom_label()
也可以在图中添加文字,进而实现注释的效果。但是需要注意的是,当使用这两个函数时,会在图中增加一个文字图层,同时该图层会映射到DataFrame中。例如,在下面的例子中,文字"Group 1"是我们使用annotate()
函数绘制的,我们将其透明度设置为0.1,而"Group 2"是我们使用geom_text()
函数绘制的,在绘制时,我们同样将其透明度设置为0.1,但是由于geom_text
函数对DataFrame数据(即faithful)的映射,因此"Group 2"被绘制了n次,因此尽管其透明度也被设置为0.1,但是其清晰度则远远高于"Group 1"。
此外需要注意的是相对于geom_text
而言,geom_label
会在文本周围添加一个背景
library(ggplot2)
p = ggplot(faithful, aes(x=eruptions, y=waiting)) +
geom_point()
p + annotate("text", x=3, y=48, label="Group1", alpha=0.1) +
geom_text(x=4.5, y=66, label="Group2", alpha=0.1)
3 分面注释
在分面上添加注释的方法有很多种,最主要还是依赖于要表达的信息:
3.1 方法一
使用分面变量创建一个新的数据框,然后设定每个分面需要绘制的值,最后配合新的数据框使用geom_text()
函数
mpg_plot <- ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(. ~ drv)
f_labels = data.frame(drv=c("4", "f", "r"), label=c("4wd", "Front", "Rear"))
mpg_plot +
geom_text(x=6, y=40, mapping=aes(label=label), data=f_labels)
lm_labels <- function(dat) {
mod <- lm(hwy ~ displ, data = dat)
formula <- sprintf("italic(y) == %.2f %+.2f * italic(x)",
round(coef(mod)[1], 2), round(coef(mod)[2], 2))
r <- cor(dat$displ, dat$hwy)
r2 <- sprintf("italic(R^2) == %.2f", r^2)
data.frame(formula = formula, r2 = r2, stringsAsFactors = FALSE)
}
library(dplyr)
labels <- mpg %>%
group_by(drv) %>%
do(lm_labels(.))
mpg_plot +
geom_smooth(method=lm, se=FALSE) +
geom_text(data=labels, aes(label=formula), x=3, y=40, parse=TRUE) +
geom_text(x=3, y=35, aes(label=r2), data=labels, parse=TRUE, hjust=0)
3.2 方法二
使用gghighlight
包
# install.packages("gghighlight")
ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
geom_point() +
gghighlight::gghighlight() +
facet_wrap(.~factor(cyl))