2016-09-30 2 views
1

У меня есть график ggplot с двумя ярлыками. Я хочу добавить обе метки на свой сюжет, выровненный по вертикали. Я хочу, чтобы мой второй ярлык был нарисован ниже первого ярлыка, но они не должны перекрываться.Как использовать ggplot для выравнивания моих двух меток?

Итак, если я хочу нарисовать первый ярлык в (20,90), где должна быть вторая метка? Очевидно, это зависит от оси y набора данных и высоты, необходимой для первой метки.

enter image description here

Q: Координаты жестко закодированы (см мой сценарий) и не будет работать для нового набора данных. Я хочу придумать такой способ, чтобы две метки всегда выровнялись по вертикали для любого набора данных и масштабирования. Мои потенциальные решения:

  1. Создать одну метку, показывающую две линии, что-то вроде Line1\nLine2
  2. Используйте алгоритм компоновки, чтобы заставить выравнивание, как tableGrob из gridExtra пакета.

Я не знаю, как сделать работ. В , я не уверен, как сделать 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) 
+2

здесь не имеет значения, но 'aes_string (x = 'data $ x', y = 'data $ y')' - плохая идея. Используйте 'aes (x = x, y = y)' вместо – baptiste

+0

@baptiste Спасибо. Но мой главный приоритет теперь позиционирует ярлыки ... – SmallChess

ответ

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

Вам сделать еще нужно ввести координаты для одной метки.

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

+0

Знаю ли я точно, сколько ширины можно присвоить ярлыкам? 'annotation_custom' требует' x_min' и 'x_max', и неясно, какую именно ширину я должен дать. – SmallChess

+0

, вы можете дать такое же значение xmin и xmax в этом случае, но таблица будет сосредоточена в этой позиции (и выйдет из строя, она не будет обрезана). Если вы хотите, чтобы левое/правое оправдание могло стать немного сложнее (вам нужно было бы обернуть вещь в gTree IIRC) – baptiste

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

+0

Спасибо. Но для решения требуется указание y-координаты второй метки, что я и пытаюсь избежать. – SmallChess

+2

Это относительная координата, так что это не зависит от вашего фактического диапазона y. –

Смежные вопросы