Hi everyone, Hi ggplot users in particular, ggplot makes it very easy to plot things given their names when you use it interactively (and therefore can provide the names of the columns). qplot(x,foo,data=A) where A has columns (x,y,foo,bar) for example but I would like to use this from inside a function to which the name of the column is given. I cannot find an elegant way to make this work. Here are my attempts: #------------------------------------------------------------ library(ggplot2) A = data.frame(x=rep(1:10,10), y=rep(1:10,each=10), u=runif(100), v=rnorm(100)) # goal: extract values for y<=5 and plot them, either for u or v foo1 <- function(uv="u") { # solution 1: do not use the data argument at all # (forces the use of qplot, could be more elegant) B = A[A$y<=5,] qplot(B$x, B$y, fill=B[[uv]], geom="tile") } foo2 <- function(uv="u") { # solution 2: extract and rename the colums, then use the data argument # (enables ggplot but could be shorter) B = A[A$y<=5,c("x","y",uv)] names(B)[3] = "value" # rem: cannot use rename since rename(B,c(uv="value")) would not work qplot(x, y, fill=value, data=B, geom="tile") # or # ggplot(B,aes(x=x,y=y,fill=value)) + geom_tile() } foo3 <- function(uv="u") { # solution 3: use the data argument and perform the extraction directly in it # (elegant and powerful but can't make it work) ggplot(A[A$y<=5,c("x","y",uv)],aes(x=x,y=y,fill=???)) + geom_tile() # or ggplot(A[A$y<=5,],aes(x=x,y=y,fill=???)) + geom_tile() # or ... } print(foo1("u")) print(foo1("v")) print(foo2("u")) print(foo3("u")) #------------------------------------------------------------ Any help in making foo3 work would be appreciated. Thanks in advance for your expertise. JiHO --- http://jo.irisson.free.fr/
Follow up. On 2007-December-13 , at 10:45 , jiho wrote:> foo1 <- function(uv="u") > { > # solution 1: do not use the data argument at all > # (forces the use of qplot, could be more elegant) > B = A[A$y<=5,] > qplot(B$x, B$y, fill=B[[uv]], geom="tile") > }---> actually this does not even work currently: Error in eval(expr, envir, enclos) : object "B" not found Which only leaves the most inelegant solution: 2 JiHO --- http://jo.irisson.free.fr/
hadley wickham
2007-Dec-13 14:56 UTC
[R] use ggplot in a function to which a column name is given
Hi Jiho, The key to solving this problem is to use aes_string instead of aes. Instead of the complicated munging that aes does to get the names of the variables, aes_string works directly with strings, so that: aes_string(x = "mpg", y = "wt") == aes(x = mpg, y = wt) So your function would look like: foo4 <- function(uv="u") { ggplot(A, aes_string(x = "x", y= "y", fill = uv)) + geom_tile() } Or ggplot(A, aes(x=x, y=y)) + aes_string(fill=uv) + geom_tile() Hope that helps! (And I've made a note to better document aes_string so you can discover after looking at aes) Hadley On 12/13/07, jiho <jo.irisson at gmail.com> wrote:> Hi everyone, Hi ggplot users in particular, > > ggplot makes it very easy to plot things given their names when you > use it interactively (and therefore can provide the names of the > columns). > qplot(x,foo,data=A) where A has columns (x,y,foo,bar) for example > > but I would like to use this from inside a function to which the name > of the column is given. I cannot find an elegant way to make this > work. Here are my attempts: > > #------------------------------------------------------------ > > library(ggplot2) > > A = data.frame(x=rep(1:10,10), y=rep(1:10,each=10), u=runif(100), > v=rnorm(100)) > > # goal: extract values for y<=5 and plot them, either for u or v > > foo1 <- function(uv="u") > { > # solution 1: do not use the data argument at all > # (forces the use of qplot, could be more elegant) > B = A[A$y<=5,] > qplot(B$x, B$y, fill=B[[uv]], geom="tile") > } > > foo2 <- function(uv="u") > { > # solution 2: extract and rename the colums, then use the data argument > # (enables ggplot but could be shorter) > B = A[A$y<=5,c("x","y",uv)] > names(B)[3] = "value" > # rem: cannot use rename since rename(B,c(uv="value")) would not work > qplot(x, y, fill=value, data=B, geom="tile") > # or > # ggplot(B,aes(x=x,y=y,fill=value)) + geom_tile() > } > > foo3 <- function(uv="u") > { > # solution 3: use the data argument and perform the extraction > directly in it > # (elegant and powerful but can't make it work) > ggplot(A[A$y<=5,c("x","y",uv)],aes(x=x,y=y,fill=???)) + geom_tile() > # or > ggplot(A[A$y<=5,],aes(x=x,y=y,fill=???)) + geom_tile() > # or ... > } > > print(foo1("u")) > print(foo1("v")) > print(foo2("u")) > print(foo3("u")) > > #------------------------------------------------------------ > > Any help in making foo3 work would be appreciated. Thanks in advance > for your expertise. > > JiHO > --- > http://jo.irisson.free.fr/ > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- http://had.co.nz/