如何使用ggplot来对齐我的两个标签?

时间:2016-09-30 05:42:29

标签: r ggplot2

我有一个带有两个标签的ggplot图。我想在我的情节上添加两个标签,垂直对齐。我想在第一个标签下方绘制第二个标签,但它们不应重叠。

因此,如果我想在(20,90)处绘制第一个标签,第二个标签应该放在哪里?显然,它取决于数据集的y轴和第一个标签所需的高度。

enter image description here

问:坐标是硬编码的(请参阅我的脚本),并且无法使用新数据集。我想提出一种方法,使得两个标签始终垂直对齐任何数据集和缩放。我的潜在解决方案是:

  1. 创建一个显示两行的标签,例如Line1\nLine2
  2. 使用布局算法强制对齐,例如tableGrob包中的gridExtra
  3. 我不知道如何使 1 有效。在 2 中,我不确定如何使tableGrob适用于单个标签。什么是最简单的解决方案?

    library(ggplot2)
    
    data <- data.frame(x=c(1:100), y=x+rnorm(100))
    
    p <- ggplot(data=data, aes_string(x='data$x', y='data$y')) + geom_point()
    
    str1 <- "italic(y) == \"1.7\" + \"1\" * italic(x) * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"0.91\""
    str2 <- "italic(y) == \"9.7\" + \"1\" * italic(x) * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"9.91\""
    
    above <- annotate("text",
                  label=str1,
                  x=20,
                  y=90,
                  parse=TRUE)
    below <- annotate("text",
                  label=str2,
                  x=20,
                  y=83,
                  parse=TRUE)
    
    p <- p + above
    p <- p + below
    
    print(p)
    

3 个答案:

答案 0 :(得分:4)

你可以尝试这样的事情,

library(gridExtra)
library(grid)

table_label <- function(label, params=list())  {

  params <- modifyList(list(hjust=0, x=0), params)

  mytheme <- ttheme_minimal(padding=unit(c(1, 1), "mm"),core = list(fg_params = params), parse=TRUE)
  disect <- strsplit(label, "\\n")[[1]]
  m <- as.matrix(disect)
  tableGrob(m, theme=mytheme)

}

txt <- 'italic(y) == 1.7 + 1 * italic(x) * "," ~~italic(r)^2 ~ "=" ~ 0.91\n
        italic(y) == 9.7 + 1 * italic(x) * "," ~~italic(r)^2 ~ "=" ~ 9.91'


library(ggplot2)

qplot(1:10,1:10) +
  annotation_custom(table_label(txt), xmin=0, xmax=5, ymin=7.5)

enter image description here

答案 1 :(得分:2)

尝试使用cowplot包,它会为您提供功能draw_label,可让您添加具有相对定位的图层:

library(ggplot2)
library(cowplot)

data <- data.frame(x = 1:100, y = (1:100) + rnorm(100))

p <- ggplot(data = data, 
            aes(x = x, 
                y = y)) + 
  geom_point()

ggdraw(p) + 
  draw_label(expression(paste(italic(y) == 1.7 + 1 * italic(x), 
                              ", ", 
                              italic(r)^2 == 0.91)), 
             .2, .9) +
  draw_label(expression(paste(italic(y) == 9.7 + 1 * italic(x), 
                              ", ", 
                              italic(r)^2 == 9.91)),
             .2, .83)

enter image description here

答案 2 :(得分:1)

您可以使用atop从两个标签中制作单个标签,将其叠加在另一个标签上:

str3 = 'atop(italic(y) == \"1.7\" + \"1\" * italic(x) * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"0.91\",
    italic(y) == \"9.7\" + \"1\" * italic(x) * \",\" ~ ~italic(r)^2 ~ \"=\" ~ \"9.91\")'

p + annotate("text",
               label=str3,
               x=20,
               y=90,
               parse=TRUE)

enter image description here

您仍然需要输入单个标签的坐标。