2016-06-20 16 views
2

Ich muss mehrere Diagramme für eine Figur anordnen. Ich erstelle individuelle Plots mit Basis- und Rastergrafiken. Um sie in einer einzigen Abbildung anzuordnen, habe ich grid.echo(), grid.grab() verwendet, um in groabs zu konvertieren und dann arrangeGrob() und grid.arrange(), um die endgültige Zahl zu bauen. Vor ein paar Wochen funktionierte meine vorläufige Zahl gut, aber jetzt, wenn ich den Code erneut durchführe, erzeugt er eine Figur mit Leerzeichen in den Rändern der Plots.Leerraum in grid.arrange generiert

ich ein minimales Beispiel hinzufügen, das das Problem zeigt, dass ich bin vor ...

##minimal example 
library(grid) 
library(gridExtra) 
library(gridGraphics) 
##test plot 
plot_n1<-plot(1:10,1:10, asp=1) 

##convert test plot to grob 
grid.echo() 
test_p<-grid.grab() 

##simulate several plots arranged in a more complex layout 
multi<-arrangeGrob(test_p, test_p, test_p, test_p, ncol=1, heights=c(1/4,1/4,1/4,1/4)) 

##create graph 
png(filename="minimal_multiplot.png", res=300, width=20, height=20, units="cm") 
grid.arrange(test_p, multi, ncol=2, widths=c(2/3,1/3)) 
dev.off() 

Was mache ich falsch?

+1

Bitte können Sie in den Paketen bearbeiten Sie dieses Beispiel ausführen müssen (ich es funktionierte, aber war nicht in der Lage, eine Lösung zu finden). Das Einstellen von 'clip =" on "' in 'arrayGrob' macht es etwas besser. –

+0

Vielen Dank Richard! Arbeitete perfekt mit meinem Code! :)) –

+0

'grid.echo()/grid.grab()' sind relativ neue Ergänzungen, und von dem was ich noch sagen kann instabil. Ich glaube nicht, dass auf der GridExtra-Seite viel zu tun ist, abgesehen von solchen Workarounds. – baptiste

Antwort

0

Es scheint in der Tat ein Problem zu sein, wenn ein graphics Stück in einen grid Plot Umwandeln dann grid.grab() Verwendung zu greifen und dann den Plot in eine kleineren Regionen zeichnen (d.h. Ihr Verfahren verwendet wird). Wenn Sie beispielsweise Ansichtsfenster verwenden, um eine etwas kleinere Region zu definieren (in der Abbildung grau dargestellt), fehlt das Achsenmaterial.

# Packages 
library(grid) 
library(gridGraphics) 

plot(1:10,1:10) 

grid.echo() 
test_p = grid.grab() 

grid.newpage() 
pushViewport(viewport(x = 0, width = .85, just = "left")) 
grid.rect(gp = gpar(col = NA, fill = "grey90")) 
grid.draw(test_p) 
upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here

Aber Paul Murrell (Autor des gridGraphics Paket) bietet eine Alternative (siehe die Beispiele in ?gridGraphics::grid.echo und pp. 156-157 von The gridGraphics package in The R Journal v7/1). Man kann eine Funktion definieren, die das Diagramm zeichnet, und dann wird diese Funktion das Argument grid.echo() zum Zeitpunkt des Zeichnens des Diagramms im Ansichtsfenster. newpage = FALSE stoppt grid beim Öffnen einer neuen Seite. Beachten Sie, dass kein Achsenmaterial abgehackt wird.

pf = function() { 
    plot(1:10,1:10) 
} 

grid.newpage() 
pushViewport(viewport(x = 0, width = .85, just = "left")) 
grid.rect(gp = gpar(col =NA, fill = "grey90")) 
grid.echo(pf, newpage=FALSE) 
upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here

So Ihr gewünschtes Grundstück zu bekommen, würde ich so etwas tun - aber immer noch Ansichtsfenster verwenden.

pf = function() { 
par(mar=c(7.2, 7.2, 1, 1), mex = .3, tcl = .15, mgp = c(3, .15, 0)) 
plot(1:10, 1:10, cex.axis = .75, cex.lab = .75) 
} 

grid.newpage() 

pushViewport(viewport(layout = grid.layout(3, 2, 
     widths = unit(c(2, 1), "null"), 
     heights = unit(c(1, 1, 1), "null")))) 

pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1:3)) 
grid.echo(pf, newpage = FALSE) 
upViewport() 

for(i in 1:3) { 
pushViewport(viewport(layout.pos.col = 2, layout.pos.row = i)) 
grid.echo(pf, newpage = FALSE) 
upViewport() 
} 

upViewport() 
grid.rect(gp = gpar(col = "grey90", size = .1, fill = NA)) 

enter image description here