knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" ) suppressPackageStartupMessages({ library(dplyr) library(ggplot2) library(tidyr) library(minisvg) library(svganim) }) set.seed(1) # for repeatable stipple pattern
# pkgdown::build_site(override = list(destination = "../coolbutuseless.github.io/package/svganim"))
svganim
provides some simple parameterised animations
(created using minisvg
) to apply to svg objects.
Because github sanitises SVG to remove some elements of style, scripting and animation, please see the svganim pkgdown website to view the animations.
This package is meant to be a quick start to getting animations into your SVG. To really get most out of SVG animations, you'll have to read the SVG docs and start creating your own!
The following animations are provided in this package:
create_anim_rotation()
create_anim_pattern_rotation()
create_anim_pulse_line()
create_anim_motion()
create_anim_stroke_render()
You can install from GitHub with:
# install.packages("devtools") devtools::install_github("coolbutuseless/minisvg") # Build SVG documents with R devtools::install_github("coolbutuseless/svganim") # This package
create_anim_pattern_rotation()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a simple pattern using the `svgpatternsimple` package #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ stripes <- svgpatternsimple::create_pattern_stripe(id = 'stripe') #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a pattern rotation animation and add it to the pattern #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ anim1 <- create_anim_pattern_rotation() stripes$append(anim1)
cat( "<pre>", "<details><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(stripes)), "</details>", "</pre>", sep='')
if (interactive()) { stripes$show() stripes$save_full_svg("man/figures/README-stripe-rotation.svg", height = 100) }
create_anim_pulse_line()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a document in `minisvg` #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ library(minisvg) doc <- minisvg::svg_doc(width = 400, height = 200) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create the pulse animation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pulse <- create_anim_pulse_line(size2 = 20) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a rectangle which includes the animation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rect <- stag$rect( x = "10%", y = "10%", width = "80%", height = "80%", fill = "lightblue", stroke = 'black', pulse ) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Add the animated rectangle to the svg document and save #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doc$append(rect) # doc$show() doc$save("man/figures/README-example-pulse.svg")
cat( "<pre>", "<details><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(doc)), "</details>", "</pre>", sep='')
create_anim_stroke_render()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a document in `minisvg` #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ library(minisvg) doc <- minisvg::svg_doc(width = 400, height = 200) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create the pulse animation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ stroke_render <- create_anim_stroke_render(size2 = 20) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a rectangle which includes the animation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rect <- stag$rect( x = "10%", y = "10%", width = "80%", height = "80%", fill = "lightblue", stroke = 'black', stroke_dasharray = 2000, stroke_render ) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Add the animated rectangle to the svg document and save #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doc$append(rect) # doc$show() doc$save("man/figures/README-example-stroke-render.svg")
cat( "<pre>", "<details><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(doc)), "</details>", "</pre>", sep='')
create_anim_rotation()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a document in `minisvg` #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ library(minisvg) doc <- minisvg::svg_doc(width = 400, height = 200) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create the rotation animation around a particular point #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rotation <- create_anim_rotation(cx = 200, cy = 100) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a rectangle which includes the animation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rect <- stag$rect( x = "10%", y = "10%", width = "80%", height = "80%", fill = "lightblue", stroke = 'black', rotation ) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Add the animated rectangle to the svg document and save #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doc$append(rect) # doc$show() doc$save("man/figures/README-example-rotation.svg")
cat( "<pre>", "<details><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(doc)), "</details>", "</pre>", sep='')
In this example, the pulse of the line width is done in conjunction with moving the rectangle along a path.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a document in `minisvg` #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ library(minisvg) doc <- minisvg::svg_doc(width = 400, height = 200) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create the motion animated along the path given by xs, ys #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ path_motion <- create_anim_motion(xs = c(20, 180, 180, 20), ys = c(20, 20, 80, 80)) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a rectangle which includes multiple animations #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rect <- stag$rect( x = "10%", y = "10%", width = "20%", height = "20%", fill = "lightblue", stroke = 'black', path_motion, pulse ) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Add the animated rectangle to the svg document and save #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ doc$append(rect) # doc$show() doc$save("man/figures/README-example-pathmotion.svg")
cat( "<pre>", "<details><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(doc)), "</details>", "</pre>", sep='')
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Building an SVG logo with an animated stripe #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ logo <- svg_doc(width = 200, height = 200) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a simple pattern using the `svgpatternsimple` package #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ stripes <- svgpatternsimple::create_pattern_stripe(id = 'stripe', colour = '#002366', fill_fraction = 0.5) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a pattern rotation animation and add it to the pattern #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ anim1 <- create_anim_pattern_rotation(duration = 30) stripes$append(anim1) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Add the pattern to the documents list of definitions #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ logo$defs(stripes) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create a hexagon filled with this pattern, and add it to the document #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ len <- 100 angles <- (seq(0, 360, 60) + 90) * pi/180 xs <- round(len * cos(angles) + 100, 2) ys <- round(len * sin(angles) + 100, 2) hex <- stag$polygon(id = 'hex', xs = xs, ys = ys) hex$update(stroke = '#c0c0c0', fill = stripes) logo$append(hex) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # output #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # logo$show() logo$save("man/figures/logo.svg")
if (interactive()) { logo$show() } # logo$save_full_svg("man/figures/logo.svg", height=100, include_declaration = FALSE)
cat( "<pre>", "<details open><summary style='color: #4169E1;'> Show/hide SVG text </summary>", htmltools::htmlEscape(as.character(logo)), "</details>", "</pre>", sep='')
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.