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")

``

ggplot r语言 缩放 r语言ggplot添加图例_图例

删除图例

p4 <- p + guides(colour = "none") ## 删除指定参数图例
p5 <- p + theme(legend.position = "none") ## 删除所有图例

p+p4+p5+plot_annotation(tag_levels=LETTERS[1:3])

ggplot r语言 缩放 r语言ggplot添加图例_图例_02

合并图例

p6 <-p + guides(colour = guide_legend("title"), size = guide_legend("title"),
                       shape = guide_legend("title"))
p+p6+plot_annotation(tag_levels=LETTERS[1:3])

ggplot r语言 缩放 r语言ggplot添加图例_图例_03

拆分图例

合并图例是将图例的名字设置为同一个,那么拆分图例也是同理,即将同一个名字的图例拆分成不同名字即可。

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

ggplot r语言 缩放 r语言ggplot添加图例_坐标轴_04

修改图例符号

在之前的绘图中,图例的样式一般默认与几何类型一致,即点图的图例就是点,线图的图例就是线,柱状图的图例就是色块,但是,这个图例符号也可以通过设定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])

ggplot r语言 缩放 r语言ggplot添加图例_ggplot r语言 缩放_05

Guides修改图例

严格来说,坐标轴和图例被统称为guides,所以guides函数不仅仅可以修改图例,还可以对坐标轴进行修改,不过此处仅介绍guides函数对图例的修改。

ggplot r语言 缩放 r语言ggplot添加图例_图例_06

guides中一共有两个函数可以对图例进行修改,分别为guide_colourbarguide_legend,一个是针对连续分布的变量,一个是针对离散的变量。

ggplot r语言 缩放 r语言ggplot添加图例_ci_07

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特有函数:

  • barwidth/barheight-就是colorbar色块的参数
  • frame指的是围绕色块的线条的参数
  • ticks指的是色块里面tick的参数

legend特有参数:

  • keywidth/keyheight-就是图例符号的参数
  • ncol/nrow-可以设置图例的显示方式

Theme修改图例

通过对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