-
Notifications
You must be signed in to change notification settings - Fork 18
Animint
Animint is an R package for making interactive animated data visualizations on the web, using ggplot syntax and 2 new aesthetics:
- showSelected=variable means that only the subset of the data that corresponds to the selected value of variable will be shown.
- clickSelects=variable means that clicking a plot element will change the currently selected value of variable.
Toby Dylan Hocking initiated the project in 2013, and Susan VanderPlas (2013), Carson Sievert (2014), Tony Tsai (2015), and Kevin Ferris (2015) have provided important contributions during previous GSOC projects.
Standard R graphics are based on the pen and paper model, which makes animations and interactivity difficult to accomplish. Some existing packages that provide interactivity and/or animation are
- Non-interactive animations can be accomplished with the animation package (animint provides interactions other than moving forward/back in time).
- Some interactions with non-animated linked plots can be done with the qtbase, qtpaint, and cranvas packages (animint provides animation and showSelected).
- Linked plots in the web are possible using SVGAnnotation or gridSVG but using these to create such a visualization requires knowledge of Javascript (animint designers write only R/ggplot2 code).
- The svgmaps package defines interactivity (hrefs, tooltips) in R code using igeoms, and exports SVG plots using gridSVG, but does not support showing/hiding data subsets (animint does).
- The ggvis package defines a grammar of interactive graphics that relies on shiny’s reactivity model for most of its interactive capabilities.
- Vega can be used for describing plots in Javascript, but does not implement clickSelects/showSelected (animint does).
- RIGHT and DC implement interactive plots for some specific plot types (animint uses the multi-layered grammar of graphics so is not limited to pre-defined plot types).
For even more related work see the Graphics and Web technologies task views on CRAN, and Visualization design resources from the UBC InfoVis Group.
An ideal student project will implement several improvements to Animint. Some important items from the TODO list:
- Animint currently works using the classic ggplot2 internals in the tdhock/ggplot2 fork, but it would be nice to support the new ggplot2 internals. This would mean re-writing much of the animint.R compiler along with geom_tallrect and geom_widerect.
- New aesthetics that only make sense on the web/SVG (not in ggplot2), for example an aesthetic for stroke-opacity and fill-opacity.
- Support for multiple clickSelects aesthetics per geom.
- Currently, selected items in Animint are shown with a black border outline stroke for rectangles, and with 0.5 more alpha transparency for all other geoms. This should be configurable using new aesthetics such as selected.color, selected.alpha, etc.
- Select a subset using a URL fragment identifier such as http://bl.ocks.org/tdhock/raw/93a798530952338c87ac/#year={1976}country={Japan,Canada}.
- New hoverSelects aesthetic which updates the selection just by hovering the mouse over an element.
- Update axes/legends after changing the currently displayed data subset.
- Use crossfilter.js to compute stats based on the current subset, e.g. total homicides, maybe animint syntax like this.
- Use plumber to generate a client-server viz when there are too many data subsets to pre-compute, e.g. the last example in animint-examples/examples/PSJ.R.
Any other ideas for improving Animint are welcome as well!
YES. If you don’t know JavaScript then I suggest you read some tutorials, e.g. Mozilla JavaScript basics, W3Schools, mbostock’s blocks examples.
Please get in touch with Toby Dylan Hocking <[email protected]> and Carson Sievert <[email protected]> as soon as possible.
Do one or several — doing more hard tests makes you more likely to be selected.
- Easy: use Animint to visualize some data from your domain of
expertise, and upload your visualization to the web using
animint2gist. - Medium: translate an examples of the animation package into an Animint. Do not do one of the examples that has already been ported.
- look at source code of one of the animation package functions e.g. grad.desc() for a demonstration of the gradient descent algorithm. Translate the for loops and plot() calls into code that generates data.frames. In the grad.desc() example, there should be one data.frame for the contour lines, one for the arrows, and one for the values of the objective/gradient at each iteration.
- Use the data.frames to make some ggplots. In the grad.desc()
example, there should be one ggplot with a
geom_contourand ageom_path, and another ggplot with ageom_linethat shows objective or gradient value versus iteration, and ageom_tallrectin the background for selecting the iteration number. - Make a list of ggplots and pass that to animint2dir. For the grad.desc() example the plot list should be something like list(contour=ggplot(), objective=ggplot(), time=list(variable=”iteration”, ms=2000)).
- Medium-Hard: write a testthat unit test based on one of your Animint visualizations.
- Hard: fork the animint source code on github, then implement one of the improvements mentioned on the TODO list, and send tdhock a pull request.