2016-04-27 7 views
2

Ich wiederhole durch einige Daten, die Listen von ggplot Grafiken erzeugen, die ich zusammen auf einem einzelnen Bild drucken möchte. Mein Code hat zwei Schleifen, eine ineinander. Die äußere Schleife unterteilt die Daten basierend auf einer Variablen. Die innere Schleife unterteilt die Daten weiter und erzeugt ein Streudiagramm für jede Unterteilung; Die Diagramme werden in einer Liste gespeichert. Sobald die innere Schleife beendet ist, wird ein grid.arrange Objekt wie folgt unter Verwendung von Listenobjekten erstellt (Anmerkung: Dieser Code enthält eine benutzerdefinierte Funktion, my_scatter, die an der Unterseite dieser Frage geteilt wird):R - Ändere die Liste der ggplot-Objekte in eine Liste von grobs, die grid.arrange akzeptiert?

require(ggplot2) 
require(grid) 
require(gridExtra) 
PRIMARY LOOP STRUCTURE { 
    ... 
    my_plots = list() 
     for (j in c(1:length(my_nodes))){ 
     cur_node = my_nodes[j] 
     node_dat = temp_dat[temp_dat$Node == cur_node,] 
     p = my_scatter(node_dat, "PRE", "POST") + geom_point(aes(color = Node, shape = Recurrence_Type, size = 2)) 
     my_plots[[j]] = p 
     }   
    grid.arrange(my_plots[[1]],my_plots[[2]],my_plots[[3]],my_plots[[4]],my_plots[[5]], nrow = 4, ncol = 3) 
} 

Das Problem ist, dass für einige Wiederholungen der Schleife my_plots eine andere Anzahl von Elementen haben wird. Ich weiß, dass ich dieses Problem mit einer Reihe von bedingten Anweisungen lösen könnte:

if (length(my_plots) == 2) { 
    grid.arrange(my_plots[[1]],my_plots[[2]],nrow=1,ncol=2) 
} elsif (length(my_plots == 3) { 
    grid.arrange(my_plots[[1]],my_plots[[2]],nrow=2,ncol=2) 
} elsif... 

Aber das scheint umständlich und ich hoffe, eine weniger stumpfe Lösung zu finden. Normalerweise würde ich facet_grid() für diese Art von Sache verwenden, aber die Streudiagramme sind schwierig zu interpretieren, wenn sie in die ultradünnen Rechtecke, die facet_grid erzeugt, wenn es mehr als 2 oder 3 Plots zu erzeugen hat, verzerrt werden.

Ich sehe, dass diese question scheint das Problem mit grobs und lapply zu lösen - das sind zwei Aspekte von R Programmierung Ich hatte noch nie in der Vergangenheit viel Erfolg.

Wie kann ich entweder:

  • Änderung meiner Liste der ggplot Objekte in eine Liste von Grobs, die akzeptiert grid.arrange?
  • Tell facet_grid (oder ähnliche bestehende Funktion), dass ich mehr als eine Reihe von Plots, so dass sie in der Nähe von quadratischen sind wollen?

Hier ist die Funktion my_scatter im ersten Codeblock verwendet:

my_scatter = function (df,a,b) { 
    test1 = class(df) 
    if (! test1 == "data.frame") { 
    stop("1st Variable should be a data frame") 
    } 
    test2 = class(df[,a]) 
    valid_classes = c("integer", "numeric") 
    if (! test2 %in% valid_classes) { 
    stop("2nd Variable should either be an integer or numeric") 
    } 
    test3 = class(df[,b]) 
    if (! test3 %in% valid_classes) { 
    stop("3rd Variable should either have class numeric or integer") 
    } 
    p = ggplot(data = df, aes_string(a, b)) + xlim(0,1) + ylim(0,1) + geom_point() + geom_abline(slope = 1, intercept = 0, color = "white") 
    return(p) 
} 
+0

BTW für Ihre zweite Teilfrage, überprüfen nrow/ncol Argumente von 'facet_wrap' – baptiste

+1

BTW2 eine prägnante Weise Klassen zu überprüfen wäre' stopifnot (inherits (df " data.frame "))' – baptiste

Antwort

9
grid.arrange(grobs = my_plots) 

sollte es tun. Sie müssen die Plots nicht in Grobs konvertieren, grid.arrange macht es für Sie. Aber wenn Sie haben, könnten Sie tun:

my_grobs = lapply(my_plots, ggplotGrob) 
Verwandte Themen