разделение или удаление графиков после аранжировкиGrob

Я создал график с помощью ggplot, а позже использовал arrangeGrob для объединения этих графиков. Есть ли способ удалить части графика из этого комбинированного графика? Или может экстракт?

Вот минимальный пример:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=rnorm(20), y=rnorm(20), y2=rnorm(20))
g1 <- ggplot(df, aes(x, y)) + geom_point()
g2 <- ggplot(df, aes(x, y2)) + geom_point()
g <- arrangeGrob(g1,g2, widths=c(3.5,7.5), ncol=2)
print(g)

Я хотел бы удалить один из двух сюжетов.


person drmariod    schedule 11.06.2015    source источник


Ответы (3)


Во-первых, используйте grid.ls(), чтобы увидеть список grobs, составляющих график. Здесь вы будете искать имена двух объектов gTree, которые кодируют отдельные графики. (По сравнению с решеткой, именование групп компонентов в ggplot2 относительно бесполезно, хотя в этом случае несложно понять, какие части нужно извлечь. )

grid.ls()
# GRID.arrange.90
#   GRID.frame.84
#     GRID.cellGrob.85
#       GRID.frame.5
#         GRID.cellGrob.44
#           GRID.gTree.42
#             GRID.clip.43
#             layout
#         GRID.cellGrob.83
#           GRID.gTree.81
#             GRID.clip.82
#             layout
#     GRID.cellGrob.86
#       GRID.null.1
#     GRID.cellGrob.87
#       GRID.null.2
#     GRID.cellGrob.88
#       GRID.null.4
#     GRID.cellGrob.89
#       GRID.null.3

Затем вы можете извлечь и построить их следующим образом:

gg1 <- getGrob(g, ("GRID.gTree.42"))
grid.draw(gg1)

gg2 <- getGrob(g, ("GRID.gTree.81"))
grid.draw(gg2)
person Josh O'Brien    schedule 11.06.2015
comment
Я знал, что есть более простой способ! Должен ли он быть grid.ls(g), если вы не хотите строить его первым? Не уверен, что мой ответ вообще полезен сейчас, и я мог бы удалить его. - person Spacedman; 11.06.2015
comment
@Spacedman - Возможно, ваш подход не самый полезный, хотя, черт его знает, я использовал его достаточно часто в прошлом! - person Josh O'Brien; 11.06.2015
comment
grid.gremove("gTree.81") чтобы удалить один - person baptiste; 12.06.2015
comment
или, программно, grid.remove(unique(a$gPath[grepl("gTree", a$gPath)] )[1]) - person baptiste; 12.06.2015
comment
@baptiste Спасибо, очень приятно. Но ваше второе предложение мне не подходит. Я попытался заменить a на g, но это не помогло. Что мне не хватает? - person Josh O'Brien; 12.06.2015
comment
ой, забыл определить a <- grid.ls(print=FALSE) - person baptiste; 13.06.2015

сеточная графика — это сложные вложенные деревья вещей. Немного (хорошо, много) проб и ошибок удалось получить ваши два графика следующим образом:

 > plot(g$children[[1]]$children[[1]]$children[[1]]$children[[1]]$children[[1]]$children[[2]])
 > plot(g$children[[1]]$children[[1]]$children[[1]]$children[[2]]$children[[1]]$children[[2]])

Наверное, есть более простой способ...

person Spacedman    schedule 11.06.2015

Если вам не нужно использовать arrangeGrob: можно извлечь grobs из макета gtable. Настройка макета занимает больше времени, но извлечение необходимого элемента выполняется просто.

library(gtable)
library(grid)
gt = gtable(unit(c(3.5, 7.5), "null"), unit(1, "null"))
gt = gtable_add_grob(gt, ggplotGrob(g1), l = 1, t = 1)
gt = gtable_add_grob(gt, ggplotGrob(g2), l = 2, t = 1)

plot(gt)
plot(gt[, 1])
plot(gt[, 2])

Если вы хотите сохранить размер и положение извлеченного графика такими же, как его размер и положение на комбинированном графике:

EDIT: Используя предложение Батиста:

gt = gtable(unit(c(3.5, 7.5), "null"), unit(1, "null"))
gt = gtable_add_grob(gt, ggplotGrob(g1), name = "g1", l = 1, t = 1)
gt = gtable_add_grob(gt, ggplotGrob(g2), name = "g2", l = 2, t = 1)

grid.newpage()
grid.draw(gtable_filter(gt, "g2", trim = FALSE))

grid.newpage()
grid.draw(gtable_filter(gt, "g1", trim = FALSE))

Оригинал:

# Keep g2
p2 = gt
p2$layout = gt$layout[-1, ]
p2$grobs = gt$grobs[-1]
grid.newpage()
grid.draw(p2)

# Keep g1
p1 = gt
p1$layout = gt$layout[-2, ]
p1$grobs = gt$grobs[-2]
grid.newpage()
grid.draw(p1)
person Sandy Muspratt    schedule 12.06.2015
comment
если вы дадите имена двум гробам в gtable_add_grob(..., name="plot1"), вы можете просто использовать grid.draw(gtable_filter(gt, "plot1", trim = FALSE)) - person baptiste; 12.06.2015