cowplot包提供了很多函数用于注释图形,包括图形下方的注释,图内数学表达式,组合图的总标题等。因为ggplot2 v2.2.0本身就支持这些特性,所以推荐优先使用ggplot2本身的方法。未来两种相同的功能将从cowplot移除。
使用数学表达式注释
我们通常想要使用数学表达式注释图形,比如我们想要在图形中显示一个统计分析结果。为此,cowplot定义了函数draw_label()
,它可以给一个图形添加任意检验或数学表达式。
依赖于应用,我们可能想要以绝对坐标(独立于绘图数学)或以数据的坐标指定标签位置。draw_label()
支持这两者。前者,我们使用draw_label()
连接ggdraw()
:
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()
添加到图形:
# adding label directly to plot, in the data coordinates
p1 draw_label(label, 20, 400, hjust = 0, vjust = 0)
连接图标题
当我们使用plot_grid()
组合图形时,我们可能想要添加一个跨越多个组合图的标题。虽然cowplot没有特定的函数实现这个效果,但可以通过以下少量代码实现。
# 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()
可以用来为图形添加下方的注释。该功能特性与ggplot2的labs()
函数的caption
参数重叠了,不过该功能会依旧保留。如果你觉得caption
实现不了你想要的效果,不妨试试add_sub()
。
为了说明如何使用add_sub()
,我们先创建一个图形:
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
是相对于已经添加到图形下方的空间(有点疑惑,需要尝试才知道),它们不是以绘制的数据度量的。这保证了多个数据不同的图形可以将注释绘制在相同的位置。
ggdraw(add_sub(p1, "Annotation inside plot", vpadding=grid::unit(0, "lines"),
y = 6, x = 0.03, hjust = 0))