legend就是ggplot绘制过程中,对分类变量产生的一个解释性图像,通常位于ggplot图形的右侧。
一般而言,我们可以使用guides
,theme
,scale_*
函数对图里进行操作,其中:
scale_*
函数,通常只能对一个美学映射进行操作guides
可以对多个美学映射进行操作theme
对图例的修改方式与上述两种方法不同,但是最后也能通过对图例对象的设置达到修改图例的目的。以下,我们就介绍如何对图例进行修改。
以下三种方式是等价的。
dat <- data.frame(x = 1:5, y = 1:5, p = 1:5, q = factor(1:5),
r = factor(1:5))
p <- ggplot(dat, aes(x, y, colour = p, size = q, shape = r)) + geom_point()
p1 <- p + guides(colour = "colorbar", size = "legend", shape = "legend")
p2 <- p + guides(colour = guide_colorbar(), size = guide_legend(),
shape = guide_legend())
p3 <- p +
scale_colour_continuous(guide = "colorbar") +
scale_size_discrete(guide = "legend") +
scale_shape(guide = "legend")
p4 <- p + guides(colour = "none") ## 删除指定参数图例
p5 <- p + theme(legend.position = "none") ## 删除所有图例
p+p4+p5+plot_annotation(tag_levels=LETTERS[1:3])
p6 <-p + guides(colour = guide_legend("title"), size = guide_legend("title"),
shape = guide_legend("title"))
p+p6+plot_annotation(tag_levels=LETTERS[1:3])
合并图例是将图例的名字设置为同一个,那么拆分图例也是同理,即将同一个名字的图例拆分成不同名字即可。
p1 <- ggplot(dat, aes(x, y, shape = r, size = r,color=r))+geom_point()
p2 <- p1 + guides(shape = guide_legend("shape"),size=guide_legend("size"))
p1+p2
在之前的绘图中,图例的样式一般默认与几何类型一致,即点图的图例就是点,线图的图例就是线,柱状图的图例就是色块,但是,这个图例符号也可以通过设定key_glyph 参数进行修改,或通过draw_key_*函数定义图例符号。
ls("package:ggplot2", pattern="^draw_key_.+")
## [1] "draw_key_abline" "draw_key_blank" "draw_key_boxplot" "draw_key_crossbar"
## [5] "draw_key_dotplot" "draw_key_label" "draw_key_path" "draw_key_point"
## [9] "draw_key_pointrange" "draw_key_polygon" "draw_key_rect" "draw_key_smooth"
## [13] "draw_key_text" "draw_key_timeseries" "draw_key_vline" "draw_key_vpath"
可以发现,一共有16种符号可以设置,这也对应了我们所能绘制的几何图形种类。
p <- ggplot(economics, aes(date, psavert, color = "savings rate"))
p1 <- p+ geom_line()
p2 <- p + geom_line(key_glyph = "timeseries")
p3 <- p + geom_line(key_glyph = draw_key_timeseries)
p4 <- p + geom_line(key_glyph = draw_key_rect)
p1+p2+p3+p4+plot_layout(ncol = 2)+plot_annotation(tag_levels = LETTERS[1:4])
严格来说,坐标轴和图例被统称为guides,所以guides函数不仅仅可以修改图例,还可以对坐标轴进行修改,不过此处仅介绍guides函数对图例的修改。
guides中一共有两个函数可以对图例进行修改,分别为guide_colourbar
和guide_legend
,一个是针对连续分布的变量,一个是针对离散的变量。
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"),
...
)
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,
...
)
虽然看上去有很多参数,不过其实这两个函数大部分参数都是有规律的,可以分为以下几种。
两个函数共有的参数:title,label,reverse,order,direction等。
colorbar特有函数:
legend特有参数:
通过对guides的学习,可以发现,guides虽然可以修改图例,但是修改的内容十分有限,比如它就不能把修改图例的位置,以及修改图例中某些显示参数,这个时候就需要使用theme来对图里进行进一步优化。
组件 | 对应的element_功能() | 描述 |
---|---|---|
legend.background | element_rect() | 图例背景 |
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=左) |
legend.spacing | unit() | 图例之间的间距 |
legend.position | 向量 | 图例的位置(“none”, “left”, “right”, “bottom”, “top”,或两个数值向量) |
legend.direction | horizontal/vertical | 图例的布局 |
legend.justification | 向量 | 图例的精修位置,双元素数值向量 |
https://zhuanlan.zhihu.com/p/463041897
https://zhuanlan.zhihu.com/p/362736163