library(minixcali) library(purrr) library(knitr) opts_chunk$set(message = FALSE, warning=FALSE, fig.width = 7, fig.height = 4, out.width='50%')
Let's import a volcano in Excalidraw; since there's no support for raster graphics, we'll use the {isobands}
package to create polygonal contour lines.
The {isobands}
package takes a matrix of elevations and returns a number of contour lines at different heights. Adapting the documentation's example with the R volcano dataset,
library(minixcali) library(isoband) m <- volcano b <- isobands((1:ncol(m))/(ncol(m)+1), (nrow(m):1)/(nrow(m)+1), m, 10*(9:19), 10*(10:20)) str(b, list.len = 3)
We have a number of polygons with (x,y) coordinates to pass to xkd_draw()
elements, but note that some of these polygons are not simply connected: this will be a problem as Excalidraw will join the pieces that should be disjoint. We'll therefore break down each path into separate groups using the id
attribute returned by isobands()
.
p <- split(data.frame(b[[2]]), b[[2]]$id) str(p)
We now proceed to build the Excalidraw scene one subpath at a time, colouring the levels with both fill and colour.
d <- Excali_doc() library(scales) fills <- scales::viridis_pal(alpha = 0.2)(length(b)) cols <- scales::viridis_pal(alpha = 1)(length(b)) scale <- 500 for(ii in seq_along(b)) { fill <- fills[ii] col <- cols[ii] l <- b[[ii]] spl <- split(data.frame(x = l$x, y = -l$y), l$id) for (s in spl) { r_x <- range(s$x) r_y <- range(s$y) m <- scale * cbind(s$x - r_x[1], s$y - r_y[1]) shape <- xkd_draw( x = scale * r_x[1], y = scale * r_y[1], width = scale * diff(r_x), height = scale * diff(r_y), strokeWidth = 0.8, roughness = 2L, strokeSharpness = "sharp", groupIds = list("levelplot", paste0('level-', ii)), fillStyle = "solid", strokeColor = col, backgroundColor = fill, points = m ) d$add(shape) } } d$export('volcano.json')
You can see this drawing at: https://excalidraw.com/#json=6037869848166400,542JGip6v1DtWfHgYEvG5w
knitr::include_graphics('volcano.png')
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.