--- title: "Multiple SVG" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Multiple SVG} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 4 ) ``` ```{r setup} library(ggplot2) library(ggsvg) ``` ## Multiple different SVG Since SVG is just a character string, you can set a different SVG for every row of a data.frame, and then use this column as the `svg` aesthetic. ```{r eval = FALSE} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Read multiple SVG somehow #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ statue <- paste(readLines("https://www.svgrepo.com/download/227885/statue-of-liberty.svg"), collapse = "\n") building <- paste(readLines("https://www.svgrepo.com/download/129010/bank-sign.svg") , collapse = "\n") sign <- paste(readLines("https://www.svgrepo.com/download/118570/exit-sign.svg") , collapse = "\n") ``` ```{r eval=TRUE, echo=FALSE} # Local Cache statue <- paste(readLines("svg/statue-of-liberty-svgrepo-com.svg"), collapse = "\n") building <- paste(readLines("svg/bank-sign-svgrepo-com.svg") , collapse = "\n") sign <- paste(readLines("svg/exit-sign-svgrepo-com.svg") , collapse = "\n") ``` ```{r} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Define a data.frame mapping 'type' to actual 'svg' #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ icons_df <- data.frame( type = c('statue', 'building', 'sign'), svg = c( statue , building , sign ), stringsAsFactors = FALSE ) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Create some Points-of-Interest and assign an svg to each #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ N <- 20 poi <- data.frame( lat = runif(N), lon = runif(N), type = sample(c('statue', 'building', 'sign'), N, replace = TRUE), stringsAsFactors = FALSE ) poi <- merge(poi, icons_df) #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # {ggsvg} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ggplot(poi) + geom_point_svg( aes(x = lon, y = lat, svg = I(svg)), size = 10 ) + labs( title = "{ggsvg} multiple SVG images" ) + theme_bw() ``` ## Alternate approach to multiple different SVG Instead of adding each `svg` to the `poi` data.frame, map `type` to the `svg` aesthetic and use a `scale_svg_discrete_manual()` to map from `type` to the actual SVG. ```{r} ggplot(poi) + geom_point_svg( aes(x = lon, y = lat, svg = type), size = 10 ) + scale_svg_discrete_manual( aesthetics = 'svg', values = c(statue = statue, building = building, sign = sign), guide = guide_legend(override.aes = list(size = 5)) ) + labs( title = "{ggsvg} multiple SVG images" ) + theme_bw() ```