[datatable-help] ggplot2 and data.table

Matthew Dowle mdowle at mdowle.plus.com
Tue Aug 16 08:26:07 CEST 2011


Thanks a lot, that makes sense to me now ...

On Mon, 2011-08-15 at 07:51 +0100, Timothée Carayol wrote:
> You are right -- I should have given a bit more context.
> 
> 
> 1) The usual ggplot2 syntax mostly works with data.tables, though
> sometimes coercing to a data.frame is necessary. I do not have a
> reproducible example of that at hand, but I thought it's probably
> something that would require a fix in ggplot2, and not data.table.
> I'll try to find you a reproducible example if that's useful.

Yes please.

> 
> 2) What I wanted to allow, was to call ggplot inside a data.table
> call, e.g. 
> 
> 
> test <- data.table(
>                    a=rnorm(4*26), 
>                    b=letters
>                    )
> test[,
>   list(y=max(a)), 
>   by=b
> ][,
>   ggplotDT(x=b, y=y) + 
>   geom_point() +
>   scale_x_discrete("group") +
>   scale_y_continuous("maximum") +
>   coord_flip()
> ]
> 
> 
> I would otherwise have to create an object specifically to contain the
> data to plot, which often I find to be a superfluous step. But maybe
> that's just me, and that's a minor point anyway.
> 
> 
> By default, ggplot() (and more specifically aes()) looks only at two
> environments: the global environment, and the data.frame provided as
> its first argument.

Ah. Is there any possibility of ggplot being changed to look in the
calling frame?

> That means that with(DF, ggplot(, aes(...)) + ...) doesn't work;
> neither does DT[, ggplot(, aes(...)) + ...]. With aesDT, provided in
> my previous email, these uses become possible.

Ok these seem like good additions to data.table (assuming ggplot can't
be changed).  Does it have to be a different name (aesDT) or could there
be an aes in data.table masking the one in ggplot.  Possibly aes could
be internal to data.table, not exported, so user wouldn't realise it's
being masked. Maybe that's a bad thing, though. Views?

Matthew

> 
> On Aug 14, 2011 11:34 PM, "Matthew Dowle" <mdowle at mdowle.plus.com>
> wrote:
> > 
> > I'm not a ggplot2 expert by any means but I thought tests 167 and
> 168
> > already tested compatibility. It needs to be called in the following
> > way, though :
> > 
> > DT <- data.table(a=1:10, b=1:10)
> > ggplot(DT,aes(x=a,y=b))+geom_line()
> > 
> > If you have ggplot2 loaded, then running test.data.table() should
> flash
> > up the ggplot2 plots.
> > 
> > Are these forms ok or am I missing something?
> > 
> > Matthew
> > 
> > 
> > On Sun, 2011-08-14 at 21:55 +0100, Timothée Carayol wrote:
> >> Ah sorry -- the definition of ggplotDT() should be, of course:
> >> 
> >> 
> >> ggplotDT <- function(...) {
> >> ggplot(, aesDT(...))
> >> }
> >> 
> >> 
> >> (aes_now() was an artifact from Hadley Wickham's Stack Overflow
> tip)
> >> 
> >> 
> >> t
> >> 
> >> 
> >> 
> >> 2011/8/14 Timothée Carayol <timothee.carayol at gmail.com>
> >> Hi,
> >> 
> >> For some time I have been wishing that data.table and ggplot2
> >> could play a bit nicer together.
> >> For example, I would like this to work but it doesn't:
> >> 
> >> > test <- data.table(a=1:10, b=1:10)
> >> > test[, ggplot() + geom_line(aes(x=a, y=b))]
> >> Error in eval(expr, envir, enclos) : object 'a' not found
> >> 
> >> I spent a few dozen minutes trying to understand what was
> >> going on (and stumbling upon this useful advice from Hadley
> >> Wickham), and it turns out that it's very easy to fix (though
> >> the fix is not very pretty).
> >> Datatable-help, I present you with.. aesDT and ggplotDT.
> >> 
> >> 
> >> aesDT <- function(...) {
> >> aes <- structure(list(...), class = "uneval")
> >> rename_aes(aes)
> >> }
> >> 
> >> Using aesDT() instead of aes() whenever you are in a
> >> data.table (or in a with()) will now work. That is pretty much
> >> all you need, but I thought I'd go just one tiny step further
> >> with ggplotDT():
> >> 
> >> ggplotDT <- function(...) {
> >> ggplot(, aes_now(...))
> >> }
> >> 
> >> which makes the following possible:
> >> 
> >> test[, ggplotDT(x=a, y=b) + geom_line()]
> >> 
> >> i.e. put the aesthetics directly as arguments, saving a few
> >> keystrokes and a pair of brackets.
> >> Tiny problem that I have yet to solve: you now have to
> >> explicitly give the name of all the aesthetics; aes() is
> >> sufficiently clever to guess them if they're in the right
> >> order, but the logic does not seem to carry over
> >> straightforwardly to aesDT().
> >> 
> >> 
> >> I know I'll be using these, so I thought maybe other people
> >> here might be interested.
> >> 
> >> 
> >> Timothee
> >> 
> >> 
> >> _______________________________________________
> >> datatable-help mailing list
> >> datatable-help at lists.r-forge.r-project.org
> >>
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help
> > 
> > 
> 




More information about the datatable-help mailing list