2015-06-11 21 views
8

Utworzono wykres z ggplot, a później użyłem arrangeGrob do połączenia tych wykresów. Czy istnieje sposób na usunięcie fragmentów wykresu z tego połączonego wykresu? A może wyodrębnić?dzielenie lub usuwanie wykresów po ustawieniu Grob

Oto minimalne przykład:

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) 

Chciałbym usunąć jedną z dwóch działek.

Odpowiedz

4

pierwsze, należy grid.ls() zobaczyć listę groby, które składają się na fabułę. Tutaj będziesz szukał nazw dwóch obiektów, które kodują poszczególne wykresy. (W porównaniu do kraty, ggplot2 „s nazewnictwa grobs składnikiem jest stosunkowo mało pomocny, chociaż w tym przypadku, to nie jest zbyt trudne, aby zobaczyć, które elementy będziemy chcieli, aby wyodrębnić.)

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 

Następnie, można wyodrębnić i wykreślić je tak:

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

gg2 <- getGrob(g, ("GRID.gTree.81")) 
grid.draw(gg2) 
+0

Wiedziałem, że jest łatwiejszy sposób! Czy powinien to być "grid.ls (g)", jeśli nie chcesz go najpierw narysować? Nie jestem pewien, czy moja odpowiedź jest teraz przydatna, i mogę ją usunąć. – Spacedman

+0

@Spacedman - Twoje może nie być najbardziej przydatne podejście, chociaż lord wie, że użyłem go dość często w przeszłości! –

+0

To jest niesamowite !!! :-) Zaoszczędziłem wiele godzin !!! – drmariod

1

Grafika siatkowa to skomplikowane zagnieżdżone drzewa rzeczy. Trochę (w porządku, dużo) prób i błędów udało się uzyskać dwie działki się tak:

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

Jest prawdopodobnie łatwiejszy sposób ...

0

Jeśli nie trzeba używać arrangeGrob: jest możliwe, aby wyodrębnić grobs z układem gtable. Ustawienie układu zajmuje więcej czasu, ale ekstrakcja wymaganego elementu jest prosta.

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

Jeśli chcesz zachować wielkość i usytuowanie wydobytego działce taki sam jak jego wielkości i położenia w połączeniu działki:

EDIT: Korzystanie Baptiste za sugestię:

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

Oryginał:

# 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

jeśli podasz nazwy dwóch grobs w 'gtable_add_grob (..., name =" plot1 ")', to możesz po prostu użyć '. grid.draw (gtable_filter (gt, "plot1", trim = FALSE)) ' – baptiste