создание пользовательских аннотаций только в одном аспекте ggplot

Есть ли способ указать, что custom_annotation применяется только к одному аспекту ggplot?

Например, если я запускаю следующий код

library(tidyverse)
library(grid)

text_grob=grobTree(textGrob("text",x=0.5, y=0.6, rot=90,
    gp=gpar(col="red")))

ggplot(mtcars, aes(x=mpg, y =drat))+
  geom_point() +
  facet_wrap(~cyl) +
  annotation_custom(overrep_grob)

я понимаю это

введите здесь описание изображения

Как я могу сохранить только крайнюю правую красную «текстовую» аннотацию и не добавлять «текстовую» аннотацию к первым двум фасетам? Примечание. Я не могу использовать geom_text или annotate, потому что мне нужно использовать относительное позиционирование текста textGrob.


person Ajjit Narayanan    schedule 15.08.2018    source источник
comment
mtcars — это встроенный набор данных. Таким образом, приведенный выше код уже является репрексом. Просто запустите его в своем терминале R, и вы получите сюжет. Возможно, вам придется установить tidyverse и grid, если у вас их нет.   -  person Ajjit Narayanan    schedule 15.08.2018
comment
извините, не уловил.   -  person Suhas Hegde    schedule 15.08.2018
comment
Возможный дубликат аннотирования текста на отдельном фасете в ggplot2   -  person camille    schedule 16.08.2018
comment
См. здесь для модифицированной версии annotation_custom, которая позволяет указать панель   -  person Sandy Muspratt    schedule 16.08.2018
comment
Это очень элегантное решение! Спасибо   -  person Ajjit Narayanan    schedule 16.08.2018


Ответы (2)


egg есть geom_custom,

library(ggplot2)
library(grid)
library(egg)

d = data.frame(cyl=6, drat = 4, mpg = 15)
d$grob <- list(textGrob("text",rot=90, hjust = 0, gp=gpar(col="red")))

ggplot(mtcars, aes(x=mpg, y=drat))+
  geom_point() +
  facet_wrap(~cyl) +
  geom_custom(data = d, aes(data = grob), grob_fun = identity)
person user10231272    schedule 15.08.2018
comment
Спасибо! Можем ли мы указать любое значение для drat и mpg внутри textGrob, так как это просто заполнитель? - person Ajjit Narayanan; 15.08.2018

Вы также можете сделать это, используя geom_text, вычислив относительное положение необходимого текста. Обратите внимание, что здесь относительное положение немного отличается от того, которое вы использовали выше, потому что здесь я определяю относительное положение как некоторую долю динамического диапазона. Вы можете выбрать другое значение для rel, чтобы получить нужную позицию. Я считаю, что таким образом позиционирование становится менее произвольным.

library(tidyverse)

rel_pos <- function(.data, var, rel){
  var <- enquo(var)
  .data %>% 
    summarise(x = sum(max(!!var), min(!!var))* rel) %>% .[1, "x"]
}

my_text <- data_frame(mpg = rel_pos(mtcars, mpg, 0.5), 
                      drat = rel_pos(mtcars, drat, 0.6) , 
                      cyl = 8, lab = "text")

ggplot(mtcars, aes(x=mpg, y =drat))+
  geom_point() +
  facet_wrap(~cyl)+
  geom_text(data = my_text, aes(label = lab), color = "red", angle = 90)

Создано 15 августа 2018 г. с помощью пакета reprex (v0.2.0).

person AndS.    schedule 15.08.2018