2015-06-11 12 views
8

Ho creato un grafico con ggplot e successivamente ho utilizzato arrangeGrob per combinare tali grafici. C'è un modo per rimuovere parti un grafico da questo grafico combinato? O forse estratto?suddivisione o rimozione di grafici dopo organizGrob

Ecco un esempio minimo:

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) 

Vorrei rimuovere uno dei due lotti.

risposta

4

In primo luogo, utilizzare grid.ls() per vedere un elenco di i solchi che compongono la trama. Qui, cercherete i nomi dei due oggetti gTree che codificano i singoli grafici. (Rispetto a reticolo, ggplot2 s' intitolazione di grobs componente è relativamente inutile, anche se in questo caso, non è troppo difficile da vedere quali pezzi si desidera estrarre.)

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 

allora, è possibile estrarre e tracciare loro in questo modo:

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

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

Sapevo che c'era un modo più semplice! Dovrebbe essere 'grid.ls (g)' se non vuoi disegnarlo per primo? Non sono sicuro che la mia risposta sia utile ora e potrei eliminarla. – Spacedman

+0

@Spacedman - Il tuo potrebbe non essere l'approccio più utile, anche se il signore sa che l'ho usato abbastanza spesso in passato! –

+0

Questo è fantastico !!! :-) Mi ha salvato ore di tempo !!! – drmariod

1

la griglia grafica è un intricato nidificato di cose. Un po '(ok, molto) di tentativi ed errori è riuscito a mettere le due lotti come questo:

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

C'è probabilmente un modo più semplice ...

0

Se non si dispone di usare arrangeGrob: e 'possibile estrarre grobs da un layout gtable. Ci vuole più tempo per impostare il layout, ma l'estrazione dell'elemento richiesto è semplice.

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

Se si desidera mantenere la dimensione e il posizionamento della trama estratto lo stesso come la sua dimensione e il posizionamento nella trama combinato:

EDIT: Utilizzando suggerimento di Baptiste:

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

Originale:

# 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

se dai i nomi ai due grobs in 'gtable_add_grob (..., name =" plot1 ")', allora puoi semplicemente usare ' grid.draw (gtable_filter (gt, "plot1", trim = FALSE)) ' – baptiste

Problemi correlati