read_svg_palette <- \(path) {
xml2::read_xml(path) |>
xml2::xml_find_all(".//d1:rect") |>
xml2::xml_attr("fill")
}
pal <- read_svg_palette("https://rud.is/dl/diverging.svg")
scales::show_col(pal)
read_svg_gradient <- \(path) {
xml2::read_xml(path) |>
xml2::xml_find_all(".//d1:stop") -> stops
stringi::stri_replace_last_fixed(
str = xml2::xml_attr(stops, "stop-color"),
pattern = ")",
replacement = ", alpha = 255, maxColorValue = 255)"
) -> rgbs
list(
colours = lapply(rgbs, \(rgb) parse(text = rgb)) |>
sapply(eval) |>
stringi::stri_replace_last_regex("FF$", ""),
values = as.numeric(xml2::xml_attr(stops, "offset"))
)
}
svg_grad <- read_svg_gradient("https://rud.is/dl/diverging-gradient.svg")
scales::show_col(svg_grad$colours)
Use it:
df <- data.frame(
x = runif(100),
y = runif(100),
z1 = rnorm(100),
z2 = abs(rnorm(100))
)
ggplot2::ggplot(df, ggplot2::aes(x, y)) +
ggplot2::geom_point(ggplot2::aes(colour = z1)) +
ggplot2::scale_color_gradientn(
colours = svg_grad$colours,
values = svg_grad$values
) +
hrbrthemes::theme_ft_rc(grid="XY")