render.animation | R Documentation |
networkDynamic
objects as movies in various formats
Takes a network object which describes a sequence of changes in properties of a network and graphically renders it out as a sequence of plots to create an animation. Normally the coordinates determining the vertex positions at specified time points should have been calculated and stored in the network object, along with the slice.par
list of parameters describing when and how the network should be divided up in time. If the coordinate data is not found, compute.animation
will be called with default arguments.
Appropriate ‘static’ networks for each time region will be generated by network.collapse
. The rendering of each frame is drawn by plot.network and most arguments are supported and are passed through to control the details of rendering. The rendered images are stored using the animation
package and can be played in the plot window (ani.replay
) or saved to a movie file with saveVideo
.
render.animation(net, render.par = list(tween.frames = 10, show.time = TRUE,
show.stats = NULL, extraPlotCmds=NULL, initial.coords=0),
plot.par = list(bg='white'), ani.options = list(interval=0.1),
render.cache = c('plot.list','none'), verbose=TRUE, ...)
net |
The networkDynamic object to be rendered, usually containing pre-computed vertex positions as dynamic attributes. |
render.par |
Named list of parameters to specify the behavior of the animation.
|
plot.par |
list of ‘high-level’ plotting control arguments to be passed to |
ani.options |
list of control arguments for the animation library. For example. |
render.cache |
the default value of |
verbose |
If |
... |
Other parameters to control network rendering. See |
Most of the network plotting arguments are passed directly to plot.network.default
. All of the plot.network
arguments pased in via ... can be specified as a TEA or special type of function to be evaluated at each time step. For example, if there was a dynamic vertex attribute named 'wealth', it could be mapped to vertex size by providing the TEA name vertex.cex='wealth'
. If the wealth value needed transformation to be an appropriate vertex size, it can be specified as a function: vertex.cex=function(slice){slice%v%'wealth'*5-3}
The arguments of plot control functions must draw from a specific set of named arguments which will be substituted in and evaluated at each time point before plotting. The set of valid argument names is:
net
is the original (uncollapsed) network
slice
is the network collapsed with the appropriate onset and terminus
s
is the slice number
onset
is the onset (start time) of the slice to be rendered
terminus
is the terminus (end time) of the slice to be rendered
A few of the plot parameters have defaults that are different from the ones given by plot.network
:
jitter
defaults to FALSE
to prevent unwanted bouncing
xlim
and ylim
default to the ranges of the entire set of network coordinates. Although they can be set to function values for interesting effects...
xlab
defaults to a function to display the time range: function(onset,terminus){paste("t=",onset,"-",terminus,sep='')}
. It also will be overidden if show.stats
is set.
If no slice.par
network attribute is found to define the time range to render, it will make one up using the smallest and largest non-Inf time values, unit-length non-overlapping time steps and an aggregation rule of 'latest'.
If no dynamic coordinate information has been stored, compute.animation
will be called with default values to try to do the layout before giving up.
Additional plot commands passed in via the extraPlotCmds
argument will be passed to eval()
after each frame is rendered and can be used to add extra annotations to the plot.
One some installations, the default output from saveVideo()
(really ffmpeg) produces videos in a slightly non-standard .mp4 format that won't play in Windows Media Player or QuickTime. Users have reported that adding the argument other.opts='-pix_fmt yuv420p"
to saveVideo
corrects the problem. Recent versions of the animation
library will include this argument by default.
To avoid performance issues with the RStudio graphics device, RStudio users will see a message that ndtv is attempting to open another type of plot window. It will try to guess a platform-appropriate device type, but specific device can be pre-specified by the user by setting the R_DEFAULT_DEVICE
environment variable
A sequence of plots will be generated on the active plot device. If render.cache='plot.list'
the recorded plots are stored as a list in .ani.env$.images
.
A few of the network drawing arguments have slightly different interpretations than their plot.network equivalents:
xlab
will be used to display time and network statistics if those render.par
parameters are set
xlim
and ylim
will be set using max and min observed coordinate values so that all network slices will appear on the plot
label
if not set explicitly, will default to the vertex names for the appropriate slice network.
If the background color is transparent and not explicitly set, it will be reset to white to prevent unintentional behavior when exporting movies via ffmpeg.
Skye Bender-deMoll, and the statnet team.
Skye Bender-deMoll and McFarland, Daniel A. (2006) The Art and Science of Dynamic Network Visualization. Journal of Social Structure. Volume 7, Number 2 https://www.cmu.edu/joss/content/articles/volume7/deMollMcFarland/
compute.animation
for generating the movie coordinates, ani.replay
, plot.network
and the package vignette vignette('ndtv')
. Also render.d3movie
for displaying movies as interactive HTML5 animations in a web browser
require(ndtv)
# trivial example
triangle <- network.initialize(3) # create a toy network
add.edge(triangle,1,2)
# add an edge between vertices 1 and 2
add.edge(triangle,2,3)
# add a more edges
activate.edges(triangle,at=1) # turn on all edges at time 1 only
activate.edges(triangle,onset=2, terminus=3,
e=get.edgeIDs(triangle,v=1,alter=2))
add.edges.active(triangle,onset=4, length=2,tail=3,head=1)
render.animation(triangle)
ani.replay()
# an example with changing TEA attributes
wheel <- network.initialize(10) # create a toy network
add.edges.active(wheel,tail=1:9,head=c(2:9,1),onset=1:9, terminus=11)
add.edges.active(wheel,tail=10,head=c(1:9),onset=10, terminus=12)
# set a dynamic value for edge widths
activate.edge.attribute(wheel,'width',1,onset=0,terminus=3)
activate.edge.attribute(wheel,'width',5,onset=3,terminus=7)
activate.edge.attribute(wheel,'width',10,onset=3,terminus=Inf)
# set a value for vertex sizes
activate.vertex.attribute(wheel,'mySize',1, onset=-Inf,terminus=Inf)
activate.vertex.attribute(wheel,'mySize',3, onset=5,terminus=10,v=4:8)
# set values for vertex colors
activate.vertex.attribute(wheel,'color','gray',onset=-Inf,terminus=Inf)
activate.vertex.attribute(wheel,'color','red',onset=5,terminus=6,v=4)
activate.vertex.attribute(wheel,'color','green',onset=6,terminus=7,v=5)
activate.vertex.attribute(wheel,'color','blue',onset=7,terminus=8,v=6)
activate.vertex.attribute(wheel,'color','pink',onset=8,terminus=9,v=7)
# render it all
render.animation(wheel,edge.lwd='width',vertex.cex='mySize',vertex.col='color')
# an example with functional attributes
set.network.attribute(wheel,'slice.par',
list(start=1,end=10,interval=1, aggregate.dur=1,rule='latest'))
# render vertex size as betweeness
render.animation(wheel,vertex.cex=function(slice){(betweenness(slice)+1)/5})
# render it directly to a movie file without caching the plots (faster)
## Not run:
saveVideo( render.animation(wheel,edge.lwd='width',vertex.cex='mySize',vertex.col='color',
render.cache='none') )
## End(Not run)
# simulation based example
# disabled to save time when testing
## Not run:
require(tergm)
# load in example data, results of a basic stergm sim
data(stergm.sim.1)
# (optional) pre-compute coordinates for set time range
# (optional) limit time range to a few steps to speek example
slice.par=list(start=0,end=10,interval=1, aggregate.dur=1,rule='latest')
compute.animation(stergm.sim.1,slice.par=slice.par)
# define the number of inbetween frames and a formula for stats to display
render.par<-list(tween.frames=5,show.time=TRUE,
show.stats="~edges+gwesp(0,fixed=TRUE)")
# render the movie, with labels, smaller vertices, etc
render.animation(stergm.sim.1,render.par=render.par,
edge.col="darkgray",displaylabels=TRUE,
label.cex=.6,label.col="blue")
# preview the movie in the plot window
ani.replay()
# save the movie as mp4 compressed video (if FFMPEG installed)
saveVideo(ani.replay(),video.name="stergm.sim.1.mp4",
other.opts="-b 5000k",clean=TRUE)
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.