2015-06-11 15 views
8

Ich erstellte ein Diagramm mit ggplot und später habe ich arrangeGrob verwendet, um diese Grafiken zu kombinieren. Gibt es eine Möglichkeit, Teile eines Graphen aus diesem kombinierten Plot zu entfernen? Oder vielleicht extrahieren?Splitting oder Entfernen von Graphen nach arrangeGrob

ist hier ein minimales Beispiel:

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) 

Ich mag würde eine der beiden Grundstücke entfernen.

Antwort

4

Zuerst grid.ls() verwenden, um eine Auflistung zu sehen die grobs, die die Handlung ausmachen. Hier suchen Sie nach den Namen der beiden gTree Objekte, die die einzelnen Plots codieren. (Im Vergleich zu Gitter, ggplot2 ‚s Benennung der Komponente Grobs ist relativ wenig hilfreich, wenn auch in diesem Fall ist es nicht allzu schwer zu sehen, welche Stücke Sie extrahieren möchten.)

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 

Dann Sie können sie wie folgt extrahieren und Grundstück:

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

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

Ich wusste, dass es einen einfacheren Weg gab! Sollte es "grid.ls (g)" sein, wenn Sie es nicht zuerst grafisch darstellen wollen? Ich bin mir nicht sicher, ob meine Antwort jetzt überhaupt nützlich ist und ich könnte sie löschen. – Spacedman

+0

@Spacedman - Ihr vielleicht nicht der nützlichste Ansatz, obwohl der Herr weiß, dass ich es oft genug in der Vergangenheit verwendet habe! –

+0

Das ist genial !!! :-) Sparte mir Stunden Zeit !!! – drmariod

1

Rastergrafiken sind komplizierte verschachtelte Bäume von Dingen. Ein bisschen (okay, viel) von Versuch und Irrtum verwalten Ihre zwei Plots wie dies heraus zu erhalten:

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

Wahrscheinlich gibt es einen einfacheren Weg ...

0

Wenn Sie zu arrangeGrob nicht verwenden: Es ist möglich Grobs von einem gtable Layout zu extrahieren. Es dauert länger, das Layout einzurichten, aber das Extrahieren des erforderlichen Elements ist einfach.

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

Wenn Sie die Größe und Positionierung der extrahierten Handlung des gleiche wie seine Größe und Positionierung in dem kombinierten Grundstück zu halten:

EDIT: Baptiste Vorschlag verwenden:

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

Original:

# 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

Wenn Sie den beiden Grobnamen in 'gtable_add_grob (..., name =" plot1 ")' '' '' '' '' '' '' '' '' '' '' '' '' 'einfach geben grid.draw (gtable_filter (gt, "plot1", trimmen = FALSE)) ' – baptiste

Verwandte Themen