animint2 provides an animated, interactive grammar of graphics
Animint2 is a fork of ggplot2 that makes it possible to design multi-layer, multi-plot, interactive, and possibly animated data visualizations using just a few lines of R code. Animint2 adds the clickSelects and showSelected interactive keywords to the grammar of graphics, and renders to the web using D3. For example, this multi-layer facetted interactive animation of WorldBank data was defined using only about 60 lines of R code.
Now available on CRAN:
install.packages("animint2")
The best reference for learning is the Animint2 Designer Manual, which provides several examples and exercises to get you started using animint2.
For some examples of what kinds of interactive data visualizations can be created, see the animint gallery.
For additional usage examples, see our extensive set of test cases.
Our JCGS paper provides a detailed comparison (an executive summary is below).
R packages gganim, animation and gganimate can generate animated graphics, in which the only interaction is going forward or backward in time. In contrast animint2 provides animation and also interaction with other variables (not only time).
Typical shiny web applications provide interactive graphics with indirect manipulation (via menus/buttons/etc) but the emphasis in animint2 is direct manipulation (via mouse clicks on lines/points/etc). Direct manipulation in shiny apps can also be achieved using the excellent plotly package, in which interactivity can be specified using events; in contrast animint2 uses the clickSelects/showSelected keywords to specify interactivity.
loon is an excellent R package for interactive exploratory graphics; the focus of animint2 is interactive presentation graphics.
animint2 is a redesign of animint with:
- Cleaner syntax. In the old animint we had showSelected/clickSelects as aesthetics, and in animint2 they are now geom parameters.
- Easier installation. The old animint depended on ggplot2 but animint2 does not (it has copied the necessary functions from ggplot2).
For a concrete example of how the syntax changed, consider the following example dataviz, adapted from tests/testthat/test-renderer1-variable-value.R. The data set used to draw the blue line segments in the bottom plot looks like this:
> with(peak.problems, data.frame(selector.name=paste0(problem.name, "peaks"), problem.name, peaks, bases.per.problem))
selector.name problem.name peaks bases.per.problem
1 size.100.problem.1peaks size.100.problem.1 1 100
2 size.100.problem.2peaks size.100.problem.2 1 100
3 size.50.problem.1peaks size.50.problem.1 1 50
4 size.50.problem.2peaks size.50.problem.2 1 50
5 size.50.problem.3peaks size.50.problem.3 1 50
6 size.50.problem.4peaks size.50.problem.4 1 50
7 size.100.problem.1peaks size.100.problem.1 2 100
8 size.100.problem.2peaks size.100.problem.2 2 100
9 size.50.problem.1peaks size.50.problem.1 2 50
10 size.50.problem.2peaks size.50.problem.2 2 50
11 size.50.problem.3peaks size.50.problem.3 2 50
12 size.50.problem.4peaks size.50.problem.4 2 50
>
and the old animint code looks like this:
geom_segment(aes(
showSelected.variable=selector.name,
showSelected.value=peaks,
clickSelects=problem.name,
showSelected2=bases.per.problem),
data=peaks.dt)
In both animint and animint2, there are “selectors” which are variables in the interactive graphic that can change based on what you click on. In the old animint, selectors were specified using aesthetics:
- The
aes(clickSelects)
means that whenever you click on one of these segments, theproblem.name
selector will change. For example clicking the segment that is plotted for the first row of data will changeproblem.name
tosize.100.problem.1
. - The
aes(showSelected2)
means that the only segments that will be shown are the ones which correspond to the current value of thebases.per.problem
selector. For example the segment for the first row of data will only be shown if100
is selected for thebases.per.problem
selector. - The
showSelected.variable
andshowSelected.value
mean to show the segment only if the value ofshowSelected.value
is the current selection of theshowSelected.variable
selector. For example the segment for the first row of data will only be shown if1
is selected for thesize.100.problem.1peaks
selector.
The new animint2 syntax uses parameters instead of aesthetics, so is much more concise:
geom_segment(
showSelected=c(selector.name="peaks", "bases.per.problem"),
clickSelects="problem.name")
Both showSelected
and clickSelects
should be character
vectors. Named elements of the character vector are interpreted as the
old variable/value aes, and un-named elements are interpreted as the
old clickSelects/showSelected aes.