knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", # out.width = "100%", fig.width = 6, fig.height = 4 ) library(ggplot2) library(ggsvg) set.seed(1) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Generate the pkgdown documentation #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (FALSE) { pkgdown::build_site(override = list(destination = "../coolbutuseless.github.io/package/ggsvg")) }
ggsvg
is an extension to ggplot to use SVG images for points.
Variables may be aesthetically mapped to features within the SVG using CSS selectors via
the css()
helper function.
geom_point_svg()
for plotting points with SVG as the glyph (This is a direct
analogue to geom_point()
)scale_svg_*()
functions for controlling the aesthetic mapping.scale_svg_default()
is a sensible default for most plots.scale_svg_*
are a shadow set of ggplot2::scale_*()
functions with
adaptations needed for css()
selectors as aesthetics.scale_svg_fill_brewer()
is a direct analogue for
ggplot2::scale_fill_brewer()
Install from GitHub.
The {rsvg}
package is used
to convert SVG into an R raster object. This requires at least rsvg(>= 2.3.0).
# install.package('remotes') install.packages('rsvg') remotes::install_github('coolbutuseless/ggsvg')
svg_url <- 'https://www.svgrepo.com/download/289000/jellyfish.svg' svg_txt <- paste(readLines(svg_url), collapse = "\n")
# Local cache svg_txt <- paste(readLines("man/figures/test.svg"), collapse = "\n")
grid::grid.draw( svg_to_rasterGrob(svg_txt) )
test_df <- data.frame( x = runif(10), y = runif(10), count = sample(3:5, 10, T), type = sample(c('a', 'b', 'c'), 10, T)) test_df ggplot(test_df) + geom_point_svg(aes(x, y), svg = svg_txt) + theme_bw()
size
aestheticggplot(test_df) + geom_point_svg(aes(x, y, size = type), svg = svg_txt) + theme_bw()
Aesthetic values are mapped to SVG features with CSS Selectors.
Here is a simple SVG consisting of 2 stacked circles - a big circle on the bottom and a small circle resting on top.
snowman_txt <- ' <svg viewBox="0 0 100 100 "> <circle id="top" cx="50" cy="20" r="20" fill="brown" stroke="black" /> <circle id="bot" cx="50" cy="70" r="30" fill="brown" stroke="black" /> </svg> ' grid::grid.draw( svg_to_rasterGrob(snowman_txt, width=800, height=800) )
css()
helper functionUse the css()
helper function to target aesthetics at selected elements within
and SVG using css(selector, property = value)
E.g.
css("rect.big", stroke = x)
<rect>
elements with class = "big"
x
in data.frame to the SVG stroke
property for these targetted elements.In the following example, two css()
selectors are used within the geom_point_svg()
call:
css("circle#top", fill=type)
<circle>
elements with id = "top"
type
in data.frame to the SVG fill
property for these targetted
elements.css("circle#bot", stroke='brown')
<circle>
elements with id = "bot"
brown
for the SVG stroke
property for these targetted
elements.css("circle", 'stroke-width'=10)
<circle>
elements5
for the SVG stroke-wdith
property for these targetted
elements.To configure how the variable is mapped to the property on the selected target, you can either use:
scale_svg_default()
for reasonable defaultsscale_svg_*()
family of functionsaesthetic
argument must match exactly the
css(...)
call used in the geom_point_svg()
call.snowman_txt <- ' <svg viewBox="0 0 100 100 "> <circle id="top" cx="50" cy="20" r="20" fill="brown" stroke="black" /> <circle id="bot" cx="50" cy="70" r="30" fill="brown" stroke="black" /> </svg> ' ggplot(test_df) + geom_point_svg( aes(x, y, css("circle#top", fill = type)), css("circle#bot", stroke = 'brown'), css("circle", 'stroke-width'=10), svg = snowman_txt ) + theme_bw() + scale_svg_fill_brewer(aesthetics = css("circle#top", fill = type), palette = 'Dark2')
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.