Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making plot functions with ggplot and aes_string

Tags:

In Hadley Wickham's ggplot2 book in chapter 10.3, he alludes to making plot functions. I want to make many similar plots that use faceting, but I cannot refer to a column. If all my references are in aesthetics then I can use aes_string and everything works. Facet_wrap seems not to have an analogue.

library(ggplot2) data(iris) 

This is the plot I want to functionalize.

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

This works if I do not facet.

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

What should "sp" be two lines below? A formula, a string? Maybe the whole aproach is wrong.

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

In addition to an answer I would love pointer on how anyone approaches this problem?

like image 487
Ed Fine Avatar asked Apr 04 '12 04:04

Ed Fine


Video Answer


2 Answers

facet_wrap expects a formula as its first argument, so I'd just coerce it with as.formula, and feed in my sp as a 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') 

Alternatively if my formula was always going to look like ~[columnname], I could just build that in to flowerPlotWrap and pass in the column name:

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

(kudos to the reproducible example in your question! If everyone asked questions as well as that they'd get answers much quicker).

like image 59
mathematical.coffee Avatar answered Nov 24 '22 00:11

mathematical.coffee


Here are some alternatives using new features from ggplot2 V3.0.0

Using strings :

flowerPlot <- function(dat, sl, sw, pl, sp){   ggplot(data=dat, aes(x=!!ensym(sl), y=!!ensym(sw), color=!!ensym(pl))) +      geom_point() +     facet_wrap(eval(expr(~!!ensym(sp)))) }  flowerPlot(iris, sl='Sepal.Length', sw='Sepal.Width', pl='Petal.Length', sp = 'Species') 

Using names :

flowerPlot2 <- function(dat, sl, sw, pl, sp){   ggplot(data=dat, aes(x=!!enquo(sl), y=!!enquo(sw), color=!!enquo(pl))) +      geom_point() +     facet_wrap(eval(expr(~!!enquo(sp)))) }  flowerPlot2(iris, sl= Sepal.Length, sw=Sepal.Width, pl=Petal.Length, sp = Species) 
like image 33
Moody_Mudskipper Avatar answered Nov 23 '22 23:11

Moody_Mudskipper