技巧 | ggplot2绘图如何添加多块矩形框标注

在绘图时,对于需要进行强调的区域通常会使用矩形框对其高亮显示。本篇就来介绍在ggplot2绘图系统中,如何方便地添加多块矩形框。

「矩形函数」

ggplot2工具包中,一共有三个矩形函数:geom_rect()geom_tile()geom_raster()。它们的帮助文档也在同一界面,其描述部分(Description)译成中文如下:

geom_rect()geom_tile()函数的功能是一致的,但是参数有所区别:geom_rect()使用的是矩形四个顶点的位置,即xmin、xmax、ymin和ymax,而geom_tile()使用的是矩形的中心位置及其尺寸,即x、y、width、height。geom_tile()geom_tile()的特例,其要求所有矩形的尺寸相同。

下面分别使用geom_rect()geom_tile()函数绘制矩形。

  • geom_rect()

library(ggplot2)
library(RColorBrewer)
ggplot() +
geom_rect(aes(xmin = c(0,1,2,5),
              xmax = c(1,2,5,9),
              ymin = 0, ymax = 2,
              fill = I(brewer.pal(4, "Set3"))))
技巧 | ggplot2绘图如何添加多块矩形框标注_第1张图片
  • 在绘图时,xmin参数的四个元素指定了四个矩形水平方向的起始位置,xmax参数则指定了它们水平方向的终止位置;由于四个矩形在垂直方向的起始、终止位置相同,因此yminymax参数只需要一个元素。

  • geom_tile()

ggplot() +
  geom_tile(aes(x = c(0.5,1.5,3.5,7), y = 1,
                width = c(1,1,3,4), height = 2,
                fill = I(brewer.pal(4, "Set3"))))
技巧 | ggplot2绘图如何添加多块矩形框标注_第2张图片
  • 该图与上一幅图效果一致。两个函数的参数可以进行如下换算:x = (xmin + xmax)/2,width = xmax - xmin;垂直方向同理。

「单个矩形标注」

例如,对如下图添加一个矩形标注。

p <- ggplot(mtcars) +
  geom_point(aes(mpg, qsec, col = factor(vs))) +
  labs(col = "vs") +
  theme_bw() +
  theme(text = element_text(family = "mono", size = 15))
p
技巧 | ggplot2绘图如何添加多块矩形框标注_第3张图片
col = brewer.pal(11, "RdYlGn")
p +
  geom_rect(aes(xmin = 12, xmax = 30,
                ymin = 16, ymax = 20),
            fill = col[9], alpha = 0.03)
技巧 | ggplot2绘图如何添加多块矩形框标注_第4张图片

「多个矩形标注」

如果需要将高亮区域分为三块,分别使用不同颜色的矩形矩形标注。

p +
  geom_rect(aes(xmin = c(12,15,25), 
                xmax = c(15,25,30),
                ymin = 16, ymax = 20),
            fill = col[7:9], alpha = 0.2)

以上代码在运行时,会出现以下错误:

Error in check_aesthetics():
! Aesthetics must be either length 1 or the same as the data (32): xmin and xmax

从报错信息上可以看出,这是因为全局数据mtcars共有32个样本,ggplot2绘图系统要求局部数据的样本量为1,或与全局数据一致;而在上面代码中,geom_rect()函数使用的局部数据的样本量为3。

针对这种情况,一种方法是使用三次geom_rect()函数来绘制三个矩形框,但是这种方法比较繁琐,且不具有一般性。

p +
  geom_rect(aes(xmin = 12, xmax = 15,
                ymin = 16, ymax = 20),
            fill = col[9], alpha = 0.02) +
  geom_rect(aes(xmin = 15, xmax = 25,
                ymin = 16, ymax = 20),
            fill = col[8], alpha = 0.02) +
  geom_rect(aes(xmin = 25, xmax = 30,
                ymin = 16, ymax = 20),
            fill = col[7], alpha = 0.02)
技巧 | ggplot2绘图如何添加多块矩形框标注_第5张图片

另外一种方法是使用注释函数annotate()。关于注释函数的用法,在基础系列已经有所介绍,详见推文ggplot2 | 注释函数。

p +
  annotate("rect", xmin = c(12,15,25), xmax = c(15,25,30),
           ymin = 16, ymax = 20,
           fill = col[9:7], alpha = 0.2)
技巧 | ggplot2绘图如何添加多块矩形框标注_第6张图片

在上述代码中,alpha参数用来调整透明度,数值在[0,1]之间,数值越小,透明度越高。但是可以看出,在geom_rect()函数中alpha = 0.02的透明效果还不如annotate()函数下的alpha = 0.2。暂时还不知道其原理。

你可能感兴趣的:(python,机器学习,javascript,matlab,数据可视化)