ggplot2 | 图例(Ⅰ):图例函数、主题函数中的图例参数
感谢老俊俊的大力支持。我们会每日跟新,欢迎您关注老俊俊的生信笔记。
本篇是ggplot2
基础语法系列的第六篇推文,来介绍与图例相关的函数和参数。
library(ggplot2)
library(patchwork)
下面两幅图代码的区别仅在于映射关系中,一个是col = cyl
,另一个是col = factor(cyl)
:
p11 <- ggplot(mtcars, aes(mpg, drat)) +
geom_point(aes(col = cyl))
p21 <- ggplot(mtcars, aes(mpg, drat)) +
geom_point(aes(col = factor(cyl)))
p11 + p21

图1是映射变量为连续变量时的默认图例形式; 图2是映射变量为离散变量时的默认图例形式。
1 图例函数
ggplot2
绘图系统的图例函数的使用方式与主题函数类似(见语法入门第5部分),需要放在guides()
函数内赋值给对应的映射参数:
guides(...)
图例函数以guide_
开头进行命名,下文依次进行介绍。
1.1 删去图例
不同于基础绘图系统,ggplot2
绘图系统的图例是自动添加的,并且与几何图形函数中的映射关系是一一对应的。但有时候,图例并不是必需的,删去图例有多种方法,具体见以下示例:
p12 <- p11 + guides(col = guide_none())
p13 <- p12 + guides(col = F)
p22 <- p21 + theme(legend.position = "none")
p12 + p13 + p22

图1和图2的方法是类似的,因为图例是由映射关系 col = cyl
产生的,那么只需在guides()
函数中将col
参数赋值为guide_none()
函数的输出内容或直接赋值为FALSE
;图3使用的是主题函数中的图例位置参数,它不针对特定的映射关系,对所有图例起作用; 两种方法的区别:当有多个图例时,图1、图2的方法只会去除由 col
参数生成的图例,对其他图例无影响;图3的方法会去除所有图例。
1.2 连续型图例
调整连续型映射关系的图例函数是guide_colourbar()
,它的语法结构如下:
guide_colourbar(
title = waiver(), title.position = NULL, title.theme = NULL,
title.hjust = NULL, title.vjust = NULL,
label = TRUE, label.position = NULL, label.theme = NULL,
label.hjust = NULL, label.vjust = NULL,
barwidth = NULL, barheight = NULL,
nbin = 300, raster = TRUE,
frame.colour = NULL, frame.linewidth = 0.5,
frame.linetype = 1, ticks = TRUE,
ticks.colour = "white", ticks.linewidth = 0.5,
draw.ulim = TRUE, draw.llim = TRUE,
direction = NULL, default.unit = "line",
reverse = FALSE, order = 0,
available_aes = c("colour", "color", "fill")
)
该函数的参数根据名称都很好理解,这里就不再一一介绍了。
示例如下:
p14 <- p11 + guides(col = guide_colorbar(
title = "图例",
frame.colour = "black",
ticks.colour = NA,
reverse = T,
title.vjust = 0.8,
barheight = 8))
p14

1.3 离散型图例
调整离散型映射关系的图例函数是guide_legend()
,它的语法结构如下:
guide_legend(
title = waiver(), title.position = NULL, title.theme = NULL,
title.hjust = NULL, title.vjust = NULL,
label = TRUE, label.position = NULL, label.theme = NULL,
label.hjust = NULL, label.vjust = NULL,
keywidth = NULL, keyheight = NULL,
direction = NULL, default.unit = "line",
override.aes = list(),
nrow = NULL, ncol = NULL, byrow = FALSE,
reverse = FALSE, order = 0
)
示例如下:
p23 <- p21 + guides(col = guide_legend(
title = "图例",
nrow = 2, byrow = T,
reverse = T
))
p23

1.4 分箱型图例
调整分箱型映射的图例函数有两个。
guide_coloursteps()
函数的语法结构如下:
guide_coloursteps(
even.steps = TRUE, show.limits = NULL,
ticks = FALSE, ...
)
guide_bins()
函数的语法结构如下:
guide_bins(
title = waiver(), title.position = NULL,
title.theme = NULL, title.hjust = NULL,
title.vjust = NULL, label = TRUE,
label.position = NULL, label.theme = NULL,
label.hjust = NULL, label.vjust = NULL,
keywidth = NULL, keyheight = NULL,
axis = TRUE, axis.colour = "black",
axis.linewidth = 0.5, axis.arrow = NULL,
direction = NULL, default.unit = "line",
override.aes = list(), reverse = FALSE,
order = 0, show.limits = NULL,
...
)
通过以下示例可以看出两个函数效果的区别:
p31 <- ggplot(mtcars, aes(mpg, drat)) +
geom_point(aes(col = mpg))
p32 <- p31 + guides(col = guide_colorsteps())
p33 <- p31 + guides(col = guide_bins())
p32 + p33

1.5 调整坐标轴
ggplot2
工具包的开发者认为图例与坐标轴的要素存在共通之处,因此将图例和坐标轴统称为guide
。具体见下图:

图片来源:https://ggplot2-book.org/scales-guides.html
调整坐标轴的函数是guide_axis()
,语法结构如下:
guide_axis(
title = waiver(), check.overlap = FALSE,
angle = NULL, n.dodge = 1,
order = 0, position = waiver()
)
上篇介绍了坐标标度函数,各位读者可以将其与如下代码对比:
p41 <- ggplot(mtcars, aes(mpg, drat)) + geom_point()
p41 + guides(x = guide_axis(
title = "自变量",
angle = 45
))

2 主题函数中的图例参数
图例函数对图例的调整是比较有限的,主题函数theme()
函数中与图例有关的参数如下:
theme(
...,
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,
...
)
比如许多人不太喜欢图例中自带的白色背景,尤其是在离散映射的图例中,而图例函数是不能对其调整的,需要使用主题函数中的legend.key
参数。具体见如下代码:
p24 <- p23 + theme(
legend.key = element_rect(fill = NA, colour = "grey")
)
p24

3 多图例管理
上文都是针对单个图例的介绍。当一幅图存在多种映射关系时,可能出现多个图例,下文提供一些多图例管理的思路。
第一种情况是,多个映射关系对应的是同一个离散变量,这时图例会自动进行合并,实际上不算是真正的多图例。
示例如下:
p51 <- ggplot(mtcars, aes(mpg, drat)) +
geom_point(aes(col = factor(cyl), size = factor(cyl)))
p51

第二种情况是真正的多图例,如下:
p52 <- ggplot(mtcars, aes(mpg, drat)) +
geom_point(aes(col = factor(cyl), size = factor(vs)))
p52

在使用图例函数调整时,需要分别对映射参数进行赋值:
p53 <- p52 + guides(col = guide_legend(title = "cyl",
order = 1),
size = guide_legend(title = "vs",
order = 2))
p53

order
参数用于调整图例的顺序。
使用主题函数中的图例参数时,针对的是所有图例:
p54 <- p53 + theme(
legend.key = element_rect(fill = NA, colour = "grey")
)
p54

请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!