【问题标题】:How to use ggplot to align my two labels?如何使用 ggplot 对齐我的两个标签?
【发布时间】:2016-09-30 05:42:29
【问题描述】:

我有一个带有两个标签的 ggplot 图。我想将两个标签都添加到我的绘图中,垂直对齐。我希望在第一个标签下方绘制第二个标签,但它们不应重叠。

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

问:坐标是硬编码的(参见我的脚本),不适用于新数据集。我想想出一种方法,使两个标签始终垂直对齐以进行 any 数据集和缩放。我的潜在解决方案是:

  1. 创建一个显示两行的标签,例如Line1\nLine2
  2. 使用布局算法强制对齐,例如 gridExtra 包中的 tableGrob。

我不知道如何使 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)

【问题讨论】:

  • 这里不相关,但aes_string(x='data$x', y='data$y') 是个坏主意。请改用aes(x=x, y=y)
  • @baptiste 谢谢。但我现在的首要任务是定位标签...

标签: r ggplot2


【解决方案1】:

你可以试试这样的,

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)

【讨论】:

  • 我是否确切知道标签的宽度是多少? annotation_custom 需要x_min 和x_max,目前还不清楚我应该给出的确切宽度。
  • 在这种情况下,您可以给出相同的 xmin 和 xmax 值,但表格会以该位置为中心(并且会溢出,不会被裁剪)。如果你想要左/右对齐,它可能会有点棘手(你必须将东西包装在 gTree IIRC 中)
【解决方案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)

【讨论】:

  • 谢谢。但是解决方案需要指定第二个标签的 y 坐标,这确实是我想要避免的。
  • 虽然它是一个相对坐标,所以它不取决于你的实际 y 范围。
【解决方案3】:

您可以使用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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2022-10-15
    相关资源
    最近更新 更多