2015-06-11 3 views
8

Я создал график с ggplot, а позже я использовал arrangeGrob, чтобы объединить эти графики. Есть ли способ удалить части диаграммы из этого комбинированного графика? Или, может быть, извлечь?splitting or remove graphs after organizGrob

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

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) 

Я хотел бы, чтобы удалить один из двух участков.

ответ

4

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

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) 
+0

Я знал, что есть более простой способ! Должно ли это быть 'grid.ls (g)', если вы не хотите сначала его строить? Не уверен, что мой ответ сейчас полезен, и я могу его удалить. – Spacedman

+0

@Spacedman - Твой может быть не самый полезный подход, хотя лорд знает, что я использовал его достаточно часто в прошлом! –

+0

Это потрясающе !!! :-) Сэкономил мне время! – drmariod

1

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

> 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]]) 

Там, наверное, более простой способ ...

0

Если вы не должны использовать 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) 
+1

, если вы дадите имена двум гнетам в 'gtable_add_grob (..., name =" plot1 ")', тогда вы можете просто использовать ' grid.draw (gtable_filter (gt, "plot1", trim = FALSE)) ' – baptiste