「R」cowplot(三)添加注释

2020-07-06 17:26:44 浏览数 (2)

cowplot包提供了很多函数用于注释图形,包括图形下方的注释,图内数学表达式,组合图的总标题等。因为ggplot2 v2.2.0本身就支持这些特性,所以推荐优先使用ggplot2本身的方法。未来两种相同的功能将从cowplot移除。

使用数学表达式注释

我们通常想要使用数学表达式注释图形,比如我们想要在图形中显示一个统计分析结果。为此,cowplot定义了函数draw_label(),它可以给一个图形添加任意检验或数学表达式。

依赖于应用,我们可能想要以绝对坐标(独立于绘图数学)或以数据的坐标指定标签位置。draw_label()支持这两者。前者,我们使用draw_label()连接ggdraw()

代码语言:javascript复制
c <- cor.test(mtcars$mpg, mtcars$disp, method='sp')
label <- substitute(paste("Spearman ", rho, " = ", estimate, ", P = ", pvalue),
                    list(estimate = signif(c$estimate, 2), pvalue = signif(c$p.value, 2)))
# adding label via ggdraw, in the ggdraw coordinates
ggdraw(p1)   draw_label(label, .7, .9)

后者直接用 draw_label() 添加到图形:

代码语言:javascript复制
# adding label directly to plot, in the data coordinates
p1   draw_label(label, 20, 400, hjust = 0, vjust = 0)

连接图标题

当我们使用plot_grid()组合图形时,我们可能想要添加一个跨越多个组合图的标题。虽然cowplot没有特定的函数实现这个效果,但可以通过以下少量代码实现。

代码语言:javascript复制
# make a plot grid consisting of two panels
p1 <- ggplot(mtcars, aes(x=disp, y=mpg))   geom_point(colour = "blue")   background_grid(minor='none')
p2 <- ggplot(mtcars, aes(x=hp, y=mpg))   geom_point(colour = "green")   background_grid(minor='none')
p <- plot_grid(p1, p2, labels=c('A', 'B'))
# now add the title
title <- ggdraw()   draw_label("MPG declines with displacement and horsepower", fontface='bold')
plot_grid(title, p, ncol=1, rel_heights=c(0.1, 1)) # rel_heights values control title margins

在最后一行代码中,rel_heights的值需要合适地选择以让图形的标题看起来正确。此处,标题占据了整个图形9%的高度(0.1/1.1)。

图形下方的注释

函数add_sub()可以用来为图形添加下方的注释。该功能特性与ggplot2labs()函数的caption参数重叠了,不过该功能会依旧保留。如果你觉得caption实现不了你想要的效果,不妨试试add_sub()

为了说明如何使用add_sub(),我们先创建一个图形:

代码语言:javascript复制
p1 <- ggplot(mtcars, aes(mpg, disp))   geom_line(colour = "blue")   background_grid(minor='none')
p1

现在我们添加一个图形下方的注释。

代码语言:javascript复制
p2 <- add_sub(p1, "This is an annotation.nAnnotations can span multiple lines.")
ggdraw(p2)

注意p2不是一个ggplot对象,而是一个gtable,它需要使用ggdraw()绘制。

我们可能多次重复操作,比如可以添加一个数学表达式和纯文本。

代码语言:javascript复制
p2 <- add_sub(p1, "This formula has no relevance here:", y  = 0, vjust = 0)
p3 <- add_sub(p2, expression(paste(a^2 b^2, " = ", c^2)), size=12)
ggdraw(p3)

分面图形也同样有效:

代码语言:javascript复制
plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width))  
  geom_point()   facet_grid(. ~ Species)   stat_smooth(method = "lm")  
  background_grid(major = 'y', minor = "none")   # add thin horizontal lines
  panel_border() # and a border around each panel
p2 <- add_sub(plot.iris, "Annotation underneath a faceted plot, left justified.", x = 0, hjust = 0)
ggdraw(p2)

最后,我们也可以将注释移动至图形内部。注意坐标x是相对于图形板左边边界的度量,而y是相对于已经添加到图形下方的空间(有点疑惑,需要尝试才知道),它们不是以绘制的数据度量的。这保证了多个数据不同的图形可以将注释绘制在相同的位置。

代码语言:javascript复制
ggdraw(add_sub(p1, "Annotation inside plot", vpadding=grid::unit(0, "lines"),
       y = 6, x = 0.03, hjust = 0))

0 人点赞