tags:

views:

186

answers:

2

I've been using ggplot2 for a while now, and I can't find a way to get formula from ggplot object. Though I can get basic info with summary(<ggplot_object>), in order to get complete formula, usually I was combing up and down through .Rhistory file. And this becomes frustrating when you experiment with new graphs, especially when code gets a bit lengthy... so searching through history file isn't quite convenient way of doing this... Is there a more efficient way of doing this? Just an illustration:

p <- qplot(data = mtcars, x = factor(cyl), geom = "bar", fill = factor(cyl)) + 
     scale_fill_manual(name = "Cylinders", value = c("firebrick3", "gold2", "chartreuse3")) + 
     stat_bin(aes(label = ..count..), vjust = -0.2, geom = "text", position = "identity") + 
     xlab("# of cylinders") + ylab("Frequency") + 
     opts(title = "Barplot: # of cylinders")

I can get some basic info with summary:

> summary(p)
data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11]
mapping:  fill = factor(cyl), x = factor(cyl)
scales:   fill 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_bar:  
stat_bin:  
position_stack: (width = NULL, height = NULL)

mapping: label = ..count.. 
geom_text: vjust = -0.2 
stat_bin: width = 0.9, drop = TRUE, right = TRUE 
position_identity: (width = NULL, height = NULL)

But I want to get code I typed in to get the graph. I reckon that I'm missing something essential here... it's seems impossible that there's no way to get call from ggplot object!

+2  A: 

You can store any R code as an expression with 'expression()' and then evaluate it with 'eval()'. e.g.

p <- expression(qplot(data = mtcars, x = factor(cyl), geom = "bar", fill = factor(cyl)) + 
     scale_fill_manual(name = "Cylinders", value = c("firebrick3", "gold2", "chartreuse3")) + 
     stat_bin(aes(label = ..count..), vjust = -0.2, geom = "text", position = "identity") + 
     xlab("# of cylinders") + ylab("Frequency") + 
     opts(title = "Barplot: # of cylinders"))

then

eval(p)

will produce the plot but the original code is still stored in the variable 'p' as an expression.

so

p

produces

expression(qplot(data = mtcars, x = factor(cyl), geom = "bar", 
    fill = factor(cyl)) + scale_fill_manual(name = "Cylinders", 
    value = c("firebrick3", "gold2", "chartreuse3")) + stat_bin(aes(label = ..count..), 
    vjust = -0.2, geom = "text", position = "identity") + xlab("# of cylinders") + 
    ylab("Frequency") + opts(title = "Barplot: # of cylinders"))

which is what we started with.

'eval()' can also evaluate a character string as an expression if parsed as text with parse(), e.g.

eval(parse(text='f(arg=value)')

wkmor1
Of course I can, string (character) should also suffice. Something like this: `s <- "rnorm(10)"; eval(parse(text = s))`. But obviously, there's no way of doing this directly, since `ggplot` objects do not have `call` element in the list.
aL3xa
Sure. But if ggplot isn't saving you input in the object it returns, then something like this is going to be your only option.
wkmor1
@aL3xa. Added the other way to use eval() as you suggest.
wkmor1
+2  A: 

It's not currently possible to go from a ggplot2 object to the code that (might of) created it.

hadley
I was waiting to hear this from you! =) Do you think this is a good idea? I'd certainly like to see this feature implemented in fresh release(es)...
aL3xa
It's on my to do list, but not very high up, because unfortunately it requires quite a lot of rewriting :/
hadley