【r<-ggplot2】cowplot添加注释

作者: 王诗翔 | 来源:发表于2018-12-06 21:28 被阅读23次

    Claus O. Wilke

    翻译:王诗翔

    2018-07-15

    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)
    
    image.png

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

    # adding label directly to plot, in the data coordinates
    p1 + draw_label(label, 20, 400, hjust = 0, vjust = 0)
    
    image.png

    连接图标题

    当我们使用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
    
    image.png

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

    图形下方的注释

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

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

    p1 <- ggplot(mtcars, aes(mpg, disp)) + geom_line(colour = "blue") + background_grid(minor='none')
    p1
    
    image.png

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

    p2 <- add_sub(p1, "This is an annotation.\nAnnotations can span multiple lines.")
    ggdraw(p2)
    
    image.png

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

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

    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)
    
    image.png

    分面图形也同样有效:

    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)
    
    image.png

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

    ggdraw(add_sub(p1, "Annotation inside plot", vpadding=grid::unit(0, "lines"),
           y = 6, x = 0.03, hjust = 0))
    
    image.png

    相关文章

      网友评论

        本文标题:【r<-ggplot2】cowplot添加注释

        本文链接:https://www.haomeiwen.com/subject/zreacqtx.html