Включите несколько объектов grobs в диаграмму ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Как я могу включить несколько объектов grobs в диаграмму ggplot, не используя annotation_custom все время?

Это мой код:

 df lt;- data.frame(x = 1:10, y = 1:10) df2 lt;- data.frame(x = 1 , y = 1) g lt;- ggplotGrob(ggplot(df2, aes(x, y))    geom_point()    theme(plot.background = element_rect(colour = "black")))  base lt;- ggplot(df, aes(x, y))    geom_blank()    theme_bw() base    annotation_custom(grob = g, xmin = 3, xmax = 2, ymin = 8, ymax = 10)    annotation_custom(grob = g, xmin = 1.5, xmax = 2.5, ymin = 2.8, ymax = 3)    annotation_custom(grob = g, xmin = 1.7, xmax = 2.7, ymin = 3.8, ymax = 5)    annotation_custom(grob = g, xmin = 5, xmax = 6, ymin = 7, ymax = 8.5)  

Моя настоящая проблема серьезнее, это всего лишь пример.

Есть ли способ поместить все эти гробы, например, в список и просто выбрать координаты, по которым я хочу их разместить. Или мне нужно использовать annotation_custom все время?

Любая помощь

Комментарии:

1. Можете ли вы предоставить df нам с помощью dput(df) ?

Ответ №1:

Одним из вариантов было бы поместить координаты и гробы в a tibble и использовать purrr::pmap для перебора строк тиббла, чтобы добавить гробы на ваш участок:

 library(ggplot2) library(tibble) library(purrr)  d_grob lt;- tibble(  xmin = c(3, 1.5, 1.7, 5),  xmax = c(2, 2.5, 2.7, 6),  ymin = c(8, 2.8, 3.8, 7),  ymax = c(10, 3, 5, 8.5),  grob = list(g, g, g, g) )  base    purrr::pmap(d_grob, function(grob, xmin, xmax, ymin, ymax) annotation_custom(grob = grob, xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax))  

Ответ №2:

Вы можете добавлять ggplot слои к графику с помощью списка. Один из способов приблизиться к этому-создать функцию , которая принимает список координат x и y для брутто, с помощью которого вы создали ggplotGrob() , затем создайте annotation_custom объект и добавьте его в список, который вы вернете в конце.

 df lt;- data.frame(x = 1:10, y = 1:10) df2 lt;- data.frame(x = 1 , y = 1) g lt;- ggplotGrob(ggplot(df2, aes(x, y))    geom_point()    theme(plot.background = element_rect(colour = "black")))  add_rects lt;- function(x_coords, y_coords) {  # First test that the x and y lists are the same length.   # If they are not throw an error.  if (length(x_coords) != length(y_coords)) {  stop("The x and y coordinates must be the same length")  }    grob_list lt;- list()    for (i in 1:length(x_coords)) {  # Check to see that each element in the list has exactly 2 coordinates  if (length(x_coords[[i]]) != length(y_coords[[i]] amp; length(x_coords[[i]]) != 2)) {    stop("Each x and y coordinate must be a vector of length 2 specifying  the min and max positioning.")  }  # Get the min and max values for x and y coordinates  xmin lt;- x_coords[[i]][1]  ymin lt;- y_coords[[i]][1]  xmax lt;- x_coords[[i]][2]  ymax lt;- y_coords[[i]][2]    # Create the annotation  grob lt;- annotation_custom(grob = g,   xmin = xmin,   xmax = xmax,  ymin = ymin,  ymax = ymax)  # Append it to the list that you will return after the loop  grob_list[[i]] lt;- grob  }    return(grob_list) }   base lt;- ggplot(df, aes(x, y))    geom_blank()    theme_bw()  x_coords lt;- list(  c(3, 2),  c(1.5, 2.5),  c(1.7, 2.7),  c(5, 6) )  y_coords lt;- list(  c(8, 10),  c(2.8, 3),  c(3.8, 5),  c(7, 8.5) )  base    add_rects(x_coords = x_coords, y_coords = y_coords)  

Что дает сюжет (ниже), который выглядит идентично тому, что я получил из вашего кода.

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