2012-04-04 10 views
18

In Hadley Wickhams ggplot2 Buch in Kapitel 10.3 spielt er auf Plotfunktionen an. Ich möchte viele ähnliche Diagramme erstellen, die Facettierung verwenden, aber ich kann mich nicht auf eine Spalte beziehen. Wenn alle meine Referenzen in Ästhetik sind, dann kann ich aes_string verwenden und alles funktioniert. Facet_wrap scheint kein Analogon zu haben.Erstellen von Plotfunktionen mit ggplot und aes_string

library(ggplot2) 
data(iris) 

Dies ist die Handlung ich funktionalisieren wollen.

pl.flower1 <- ggplot(data=iris, 
        aes_string(x='Sepal.Length', y='Sepal.Width', color='Petal.Length')) + 
           geom_point() +facet_wrap(~Species) 

Das funktioniert, wenn ich nicht Facette.

Was sollte "sp" zwei Zeilen darunter sein? Eine Formel, eine Zeichenfolge? Vielleicht ist der ganze Ansatz falsch.

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + geom_point() +facet_wrap(sp) 
    } 
    pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp= ?????) 

Zusätzlich zu einer Antwort würde ich gerne Zeiger auf, wie jemand nähert sich dieses Problem?

+0

Um herauszufinden, wie man diese Frage löst, würde ich wahrscheinlich zuerst [StackOverflow] (http://stackoverflow.com/questions/8043247/writing-r-functions-with-optional-arguments) überprüfen. :) – joran

+0

Auch hier gefragt: http://stackoverflow.com/questions/11028353/passing-string-variable-facet-wrap-in-gplplot-using-r –

Antwort

15

facet_wrap erwartet eine Formel als erstes Argument, also würde ich es nur mit as.formula zwingen, und ernähren sich in meinem sp als String:

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sp)) # note the as.formula 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= '~Species') 

Alternativ Wenn meine Formel immer wie ~[columnname] aussehen würde, könnte ich das einfach in flowerPlotWrap einbauen und den Spaltennamen übergeben :

flowerPlotWrap <- function(dat, sl, sw, pl, sp){ 
     ggplot(data=dat, aes_string(x=sl, y=sw, color=pl)) + 
     geom_point() +facet_wrap(as.formula(sprintf('~%s',sp))) 
} 
pl.flower3 <- flowerPlotWrap(iris, sl='Sepal.Length', 
          sw='Sepal.Width', pl='Petal.Length', 
          sp= 'Species') 

(Lob an das reproduzierbare Beispiel in Ihrer Frage! Wenn alle Fragen stellen würden und sie viel schneller Antworten bekommen würden.

+0

Danke für die klare Antwort. Wie hast du herausgefunden, dass facet_wrap eine Formel erwartet? –

+0

Wenn Sie 'facet_wrap' betrachten, heißt es' facet_wrap (Facetten, ...) 'und' Facetten: Formel, die Variablen für die Facetten spezifiziert. –

1

Ihre Funktion funktionierte für mich unverändert, wenn ich nur sp='Species' verwendet habe, d. H. Den Namen der Variablen, die Sie sehen möchten.

flowerPlotWrap(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp='Species')

enter image description here

Verwandte Themen