.hcl_colors_parameters <- as.data.frame(rbind(structure(numeric(0L), .Dim = c(0L, 16L), .Dimnames = list(NULL, | |
c("type", "h1", "h2", "h3", "c1", "c2", "c3", "l1", "l2", "l3", "p1", "p2", "p3", "p4", "cmax1", "cmax2"))), | |
"Pastel 1" = c(1, 0, NA, NA, 35, NA, NA, 85, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Dark 2" = c( 1, 0, NA, NA, 50, NA, NA, 60, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Dark 3" = c( 1, 0, NA, NA, 80, NA, NA, 60, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Set 2" = c( 1, 0, NA, NA, 60, NA, NA, 70, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Set 3" = c( 1, 10, NA, NA, 50, NA, NA, 80, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Warm" = c( 1, 90, -30, NA, 50, NA, NA, 70, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Cold" = c( 1, 270, 150, NA, 50, NA, NA, 70, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Harmonic" = c( 1, 60, 240, NA, 50, NA, NA, 70, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Dynamic" = c( 1, 30, NA, NA, 50, NA, NA, 70, NA, NA, NA, NA, NA, NA, NA, NA), | |
"Grays" = c( 2, 0, NA, NA, 0, NA, NA, 10, 98, NA, 1.3, NA, NA, NA, NA, NA), | |
"Light Grays" = c( 2, 0, NA, NA, 0, NA, NA, 30, 90, NA, 1.5, NA, NA, NA, NA, NA), | |
"Blues 2" = c( 2, 260, NA, NA, 80, NA, NA, 30, 90, NA, 1.5, NA, NA, NA, NA, NA), | |
"Blues 3" = c( 2, 245, NA, NA, 50, NA, NA, 20, 98, NA, 0.8, 1.4, NA, NA, 75, NA), | |
"Purples 2" = c( 2, 270, NA, NA, 70, NA, NA, 25, 95, NA, 1.2, NA, NA, NA, NA, NA), | |
"Purples 3" = c( 2, 270, NA, NA, 50, NA, NA, 20, 98, NA, 0.9, 1.4, NA, NA, 75, NA), | |
"Reds 2" = c( 2, 10, NA, NA, 85, NA, NA, 25, 95, NA, 1.3, NA, NA, NA, NA, NA), | |
"Reds 3" = c( 2, 10, NA, NA, 65, NA, NA, 20, 97, NA, 1.1, 1.3, NA, NA, 150, NA), | |
"Greens 2" = c( 2, 135, NA, NA, 45, NA, NA, 35, 95, NA, 1.3, NA, NA, NA, NA, NA), | |
"Greens 3" = c( 2, 135, NA, NA, 35, NA, NA, 25, 98, NA, 1, 1.5, NA, NA, 70, NA), | |
"Oslo" = c( 2, 250, NA, NA, 0, 0, NA, 99, 1, NA, 1, NA, NA, NA, 70, NA), | |
"Purple-Blue" = c( 2, 300, 200, NA, 60, 0, NA, 25, 95, NA, 0.7, 1.3, NA, NA, NA, NA), | |
"Red-Purple" = c( 2, 10, -80, NA, 80, 5, NA, 25, 95, NA, 0.7, 1.3, NA, NA, NA, NA), | |
"Red-Blue" = c( 2, 0, -100, NA, 80, 40, NA, 40, 75, NA, 1, 1, NA, NA, NA, NA), | |
"Purple-Orange" = c( 2, -83, 20, NA, 65, 18, NA, 32, 90, NA, 0.5, 1, NA, NA, NA, NA), | |
"Purple-Yellow" = c( 2, 320, 80, NA, 60, 20, NA, 30, 95, NA, 0.7, 1.3, NA, NA, 65, NA), | |
"Blue-Yellow" = c( 2, 265, 80, NA, 60, 10, NA, 25, 95, NA, 0.7, 2, NA, NA, NA, NA), | |
"Green-Yellow" = c( 2, 140, 80, NA, 50, 10, NA, 40, 97, NA, 0.7, 1.8, NA, NA, NA, NA), | |
"Red-Yellow" = c( 2, 10, 85, NA, 80, 10, NA, 25, 95, NA, 0.4, 1.3, NA, NA, NA, NA), | |
"Heat" = c( 2, 0, 90, NA, 80, 30, NA, 30, 90, NA, 0.2, 2, NA, NA, NA, NA), | |
"Heat 2" = c( 2, 0, 90, NA, 100, 30, NA, 50, 90, NA, 0.2, 1, NA, NA, NA, NA), | |
"Terrain" = c( 2, 130, 0, NA, 80, 0, NA, 60, 95, NA, 0.1, 1, NA, NA, NA, NA), | |
"Terrain 2" = c( 2, 130, 30, NA, 65, 0, NA, 45, 90, NA, 0.5, 1.5, NA, NA, NA, NA), | |
"Viridis" = c( 2, 300, 75, NA, 40, 95, NA, 15, 90, NA, 1, 1.1, NA, NA, NA, NA), | |
"Plasma" = c( 2, -100, 100, NA, 60, 100, NA, 15, 95, NA, 2, 0.9, NA, NA, NA, NA), | |
"Inferno" = c( 2, -100, 85, NA, 0, 65, NA, 1, 98, NA, 1.1, 0.9, NA, NA, 120, NA), | |
"Dark Mint" = c( 2, 240, 130, NA, 30, 33, NA, 25, 95, NA, 1, NA, NA, NA, NA, NA), | |
"Mint" = c( 2, 205, 140, NA, 40, 12, NA, 34, 94, NA, 0.5, 1, NA, NA, NA, NA), | |
"BluGrn" = c( 2, 215, 120, NA, 25, 30, NA, 31, 88, NA, 0.7, 1.1, NA, NA, 45, NA), | |
"Teal" = c( 2, 240, 180, NA, 35, 15, NA, 35, 92, NA, 0.6, 1.1, NA, NA, 40, NA), | |
"TealGrn" = c( 2, 220, 125, NA, 44, 50, NA, 49, 90, NA, 0.8, 1.2, NA, NA, 60, NA), | |
"Emrld" = c( 2, 224, 105, NA, 23, 55, NA, 25, 92, NA, 1.5, 1, NA, NA, NA, NA), | |
"BluYl" = c( 2, 250, 90, NA, 40, 55, NA, 33, 98, NA, 0.5, 1, NA, NA, NA, NA), | |
"ag_GrnYl" = c( 2, 225, 87, NA, 27, 86, NA, 34, 92, NA, 0.9, NA, NA, NA, NA, NA), | |
"Peach" = c( 2, 15, 50, NA, 128, 30, NA, 55, 90, NA, 1.1, NA, NA, NA, NA, NA), | |
"PinkYl" = c( 2, -4, 80, NA, 100, 47, NA, 55, 96, NA, 1, NA, NA, NA, NA, NA), | |
"Burg" = c( 2, -10, 10, NA, 40, 40, NA, 25, 85, NA, 1.2, 1, NA, NA, 75, NA), | |
"BurgYl" = c( 2, -10, 55, NA, 45, 30, NA, 30, 90, NA, 0.7, 1, NA, NA, 80, NA), | |
"RedOr" = c( 2, -3, 53, NA, 75, 42, NA, 44, 86, NA, 0.8, 1, NA, NA, 90, NA), | |
"OrYel" = c( 2, 5, 72, NA, 120, 49, NA, 56, 87, NA, 1, NA, NA, NA, 125, NA), | |
"Purp" = c( 2, 270, 300, NA, 55, 20, NA, 42, 92, NA, 0.6, 1, NA, NA, 60, NA), | |
"PurpOr" = c( 2, -83, 20, NA, 55, 18, NA, 32, 90, NA, 0.6, 1, NA, NA, 65, NA), | |
"Sunset" = c( 2, -80, 78, NA, 60, 55, NA, 40, 91, NA, 0.8, 1, NA, NA, 75, NA), | |
"Magenta" = c( 2, 312, 358, NA, 50, 24, NA, 27, 85, NA, 0.6, 1.1, NA, NA, 65, NA), | |
"SunsetDark" = c( 2, -35, 50, NA, 55, 60, NA, 30, 90, NA, 1.2, 1, NA, NA, 120, NA), | |
"ag_Sunset" = c( 2, -85, 70, NA, 70, 45, NA, 25, 85, NA, 0.6, 1, NA, NA, 105, NA), | |
"BrwnYl" = c( 2, -20, 70, NA, 30, 20, NA, 20, 90, NA, 1, 1.1, NA, NA, 60, NA), | |
"YlOrRd" = c( 2, 5, 85, NA, 75, 40, NA, 25, 99, NA, 1.6, 1.3, NA, NA, 180, NA), | |
"YlOrBr" = c( 2, 20, 85, NA, 50, 20, NA, 25, 99, NA, 1.3, 1.5, NA, NA, 150, NA), | |
"OrRd" = c( 2, 0, 60, NA, 90, 10, NA, 25, 97, NA, 1, 1.5, NA, NA, 135, NA), | |
"Oranges" = c( 2, 20, 55, NA, 70, 10, NA, 30, 97, NA, 1.2, 1.3, NA, NA, 150, NA), | |
"YlGn" = c( 2, 160, 85, NA, 25, 20, NA, 25, 99, NA, 1.2, 1.6, NA, NA, 70, NA), | |
"YlGnBu" = c( 2, 270, 90, NA, 40, 25, NA, 15, 99, NA, 2, 1.5, NA, NA, 90, NA), | |
"Reds" = c( 2, 0, 35, NA, 65, 5, NA, 20, 97, NA, 1.1, 1.3, NA, NA, 150, NA), | |
"RdPu" = c( 2, -70, 40, NA, 45, 5, NA, 15, 97, NA, 1, 1.3, NA, NA, 100, NA), | |
"PuRd" = c( 2, 20, -95, NA, 60, 5, NA, 20, 97, NA, 1.6, 1.1, NA, NA, 140, NA), | |
"Purples" = c( 2, 275, 270, NA, 55, 5, NA, 20, 99, NA, 1.3, 1.3, NA, NA, 70, NA), | |
"PuBuGn" = c( 2, 160, 320, NA, 25, 5, NA, 25, 98, NA, 1.4, 1.2, NA, NA, 70, NA), | |
"PuBu" = c( 2, 240, 260, NA, 30, 5, NA, 25, 98, NA, 1.5, 1.2, NA, NA, 70, NA), | |
"Greens" = c( 2, 135, 115, NA, 35, 5, NA, 25, 98, NA, 1, 1.5, NA, NA, 70, NA), | |
"BuGn" = c( 2, 125, 200, NA, 30, 5, NA, 25, 98, NA, 1.4, 1.6, NA, NA, 65, NA), | |
"GnBu" = c( 2, 265, 95, NA, 55, 10, NA, 25, 97, NA, 1.3, 1.7, NA, NA, 80, NA), | |
"BuPu" = c( 2, 320, 200, NA, 40, 5, NA, 15, 98, NA, 1.2, 1.3, NA, NA, 65, NA), | |
"Blues" = c( 2, 260, 220, NA, 45, 5, NA, 25, 98, NA, 1.2, 1.3, NA, NA, 70, NA), | |
"Lajolla" = c( 2, 90, -20, NA, 40, 5, NA, 99, 5, NA, 0.7, 0.8, NA, NA, 100, NA), | |
"Turku" = c( 2, 10, 120, NA, 20, 0, NA, 95, 1, NA, 1.7, 0.8, NA, NA, 55, NA), | |
"Blue-Red" = c( 3, 260, 0, NA, 80, NA, NA, 30, 90, NA, 1.5, NA, NA, NA, NA, NA), | |
"Blue-Red 2" = c( 3, 260, 0, NA, 100, NA, NA, 50, 90, NA, 1, NA, NA, NA, NA, NA), | |
"Blue-Red 3" = c( 3, 255, 12, NA, 50, NA, NA, 20, 97, NA, 1, 1.3, NA, NA, 80, NA), | |
"Red-Green" = c( 3, 340, 128, NA, 60, NA, NA, 30, 97, NA, 0.8, 1.5, NA, NA, 80, NA), | |
"Purple-Green" = c( 3, 300, 128, NA, 30, NA, NA, 20, 95, NA, 1, 1.4, NA, NA, 65, NA), | |
"Purple-Brown" = c( 3, 270, 40, NA, 30, NA, NA, 20, 98, NA, 0.8, 1.2, NA, NA, 70, NA), | |
"Green-Brown" = c( 3, 180, 55, NA, 40, NA, NA, 25, 97, NA, 0.8, 1.4, NA, NA, 65, NA), | |
"Blue-Yellow 2" = c( 3, 265, 80, NA, 80, NA, NA, 40, 95, NA, 1.2, NA, NA, NA, NA, NA), | |
"Blue-Yellow 3" = c( 3, 265, 80, NA, 80, NA, NA, 70, 95, NA, 0.5, 2, NA, NA, NA, NA), | |
"Green-Orange" = c( 3, 130, 43, NA, 100, NA, NA, 70, 90, NA, 1, NA, NA, NA, NA, NA), | |
"Cyan-Magenta" = c( 3, 180, 330, NA, 59, NA, NA, 75, 95, NA, 1.5, NA, NA, NA, NA, NA), | |
"Tropic" = c( 3, 195, 325, NA, 70, NA, NA, 55, 95, NA, 1, NA, NA, NA, NA, NA), | |
"Broc" = c( 3, 240, 85, NA, 30, NA, NA, 15, 98, NA, 0.9, NA, NA, NA, 45, NA), | |
"Cork" = c( 3, 245, 125, NA, 30, NA, NA, 15, 95, NA, 0.9, 1.1, NA, NA, 55, NA), | |
"Vik" = c( 3, 240, 55, NA, 45, NA, NA, 15, 95, NA, 0.8, 1.1, NA, NA, 65, NA), | |
"Berlin" = c( 3, 240, 15, NA, 60, NA, NA, 75, 5, NA, 1.2, 1.5, NA, NA, 80, NA), | |
"Lisbon" = c( 3, 240, 85, NA, 30, NA, NA, 98, 8, NA, 1, NA, NA, NA, 45, NA), | |
"Tofino" = c( 3, 260, 120, NA, 45, NA, NA, 90, 5, NA, 0.8, 1, NA, NA, 55, NA), | |
"ArmyRose" = c( 4, 0, NA, 93, 73, 18, 47, 58, 98, 52, 1.5, 0.8, 0.8, 1, NA, 55), | |
"Earth" = c( 4, 43, 82, 221, 61, 30, 45, 50, 92, 52, 1, 1, 0.8, 1, NA, 10), | |
"Fall" = c( 4, 133, 77, 21, 20, 35, 100, 35, 95, 50, 1, NA, 1.5, NA, NA, NA), | |
"Geyser" = c( 4, 192, 77, 21, 40, 35, 100, 50, 95, 50, 1, 1, 1.2, 1, 20, NA), | |
"TealRose" = c( 4, 190, 77, 0, 50, 25, 80, 55, 92, 55, 1.5, 1, 1.8, 1, 15, NA), | |
"Temps" = c( 4, 191, 80, -4, 43, 50, 78, 55, 89, 54, 1.6, 1, 1, 1, 57, 85), | |
"PuOr" = c( 4, 40, NA, 270, 70, 0, 30, 30, 98, 10, 0.6, 1.4, 1.5, 1.3, 100, 65), | |
"RdBu" = c( 4, 20, NA, 230, 60, 0, 50, 20, 98, 15, 1.4, 1.2, 1.5, 1.5, 125, 90), | |
"RdGy" = c( 4, 5, 50, 50, 60, 0, 0, 20, 98, 20, 1.2, 1.2, 1, 1.2, 125, NA), | |
"PiYG" = c( 4, 340, NA, 115, 75, 0, 50, 30, 98, 35, 1.3, 1.4, 0.8, 1.5, 100, 80), | |
"PRGn" = c( 4, 300, NA, 128, 30, 0, 30, 15, 97, 25, 1.3, 1.2, 0.9, 1.5, 65, 65), | |
"BrBG" = c( 4, 55, NA, 180, 40, 0, 30, 25, 97, 20, 0.8, 1.4, 0.8, 1.4, 75, 45), | |
"RdYlBu" = c( 4, 10, 85, 260, 105, 45, 70, 35, 98, 35, 1.5, 1.2, 0.6, 1.2, 150, 10), | |
"RdYlGn" = c( 4, 10, 85, 140, 105, 45, 50, 35, 98, 35, 1.5, 1.2, 0.8, 1.2, 150, 75), | |
"Spectral" = c( 4, 0, 85, 270, 90, 45, 65, 37, 98, 37, 1, 1.2, 1, 1.2, 120, NA), | |
"Zissou 1" = c( 4, 218, 71, 12, 46, 88, 165, 59, 82, 52, 0.2, 1, 3, 1, 33, NA), | |
"Cividis" = c( 4, 255, NA, 75, 30, 0, 95, 13, 52, 92, 1.1, 1, 1, NA, 47, NA) | |
)) | |
.hcl_colors_parameters$type <- factor(.hcl_colors_parameters$type, | |
labels = c("qualitative", "sequential", "diverging", "divergingx")) | |
hcl.pals <- function(type = NULL) { | |
if (is.null(type)) return(rownames(.hcl_colors_parameters)) | |
type <- match.arg(tolower(type), levels(.hcl_colors_parameters$type)) | |
rownames(.hcl_colors_parameters)[.hcl_colors_parameters$type == type] | |
} | |
## palette function a la rainbow(n, ...), heat.colors(n) etc. | |
hcl.colors <- function(n, palette = "viridis", | |
alpha = NULL, rev = FALSE, fixup = TRUE) | |
{ | |
## empty palette | |
n <- as.integer(n[1L]) | |
if(n < 1L) return(character()) | |
## match palette (ignoring case, space, -, _) | |
fx <- function(x) tolower(gsub("[-, _, \\,, (, ), \\ , \\.]", "", x)) | |
p <- charmatch(fx(palette), fx(rownames(.hcl_colors_parameters))) | |
if(is.na(p)) stop("'palette' does not match any given palette") | |
if(p < 1L) stop("'palette' is ambiguous") | |
p <- .hcl_colors_parameters[p, ] | |
p$type <- as.integer(p$type) | |
p <- as.matrix(p)[1L, , drop = TRUE] | |
## trajectories | |
lintrj <- function(i, p1, p2) p2 - (p2 - p1) * i | |
tritrj <- function(i, j, p1, p2, pm) ifelse(i <= j, | |
p2 - (p2 - pm) * i/j, | |
pm - (pm - p1) * abs((i - j)/(1 - j))) | |
seqhcl <- function(i, h1, h2, c1, c2, l1, l2, p1, p2, cmax) { | |
j <- 1/(1 + abs(cmax - c1) / abs(cmax - c2)) | |
if (!is.na(j) && (j <= 0 | j >= 1)) j <- NA | |
hcl(h = lintrj(i, h1, h2), | |
c = if(is.na(j)) lintrj(i^p1, c1, c2) else tritrj(i^p1, j, c1, c2, cmax), | |
l = lintrj(i^p2, l1, l2), | |
alpha = alpha, | |
fixup = fixup) | |
} | |
## adapt defaults and set up HCL colors | |
if(p["type"] == 1L) { | |
## qualitative defaults | |
if(is.na(p["h2"])) p["h2"] <- p["h1"] + 360 * (n - 1)/n | |
## h/c/l trajectories | |
i <- seq.int(1, 0, length.out = n) | |
col <- hcl(h = lintrj(i, p["h1"], p["h2"]), c = p["c1"], l = p["l1"], alpha = alpha, fixup = fixup) | |
} else if(p["type"] == 2L) { | |
## sequential defaults | |
if(is.na(p["h2"])) p["h2"] <- p["h1"] | |
if(is.na(p["c2"])) p["c2"] <- 0 | |
if(is.na(p["p2"])) p["p2"] <- p["p1"] | |
## h/c/l trajectories | |
i <- seq.int(1, 0, length.out = n) | |
col <- seqhcl(i, p["h1"], p["h2"], p["c1"], p["c2"], p["l1"], p["l2"], p["p1"], p["p2"], p["cmax1"]) | |
} else if(p["type"] == 3L) { | |
## diverging defaults | |
if(is.na(p["p2"])) p["p2"] <- p["p1"] | |
## h/c/l trajectories | |
n2 <- ceiling(n/2) | |
i <- seq.int(1, by = -2/(n - 1), length.out = n2) | |
col <- c(seqhcl(i, p["h1"], p["h1"], p["c1"], 0, p["l1"], p["l2"], p["p1"], p["p2"], p["cmax1"]), | |
rev(seqhcl(i, p["h2"], p["h2"], p["c1"], 0, p["l1"], p["l2"], p["p1"], p["p2"], p["cmax1"]))) | |
if(floor(n/2) < n2) col <- col[-n2] | |
} else if(p["type"] == 4L) { | |
## divergingx defaults | |
if(is.na(p["p2"])) p["p2"] <- p["p1"] | |
if(is.na(p["p4"])) p["p4"] <- p["p2"] | |
## h/c/l trajectories | |
n2 <- ceiling(n/2) | |
i <- seq.int(1, by = -2/(n - 1), length.out = n2) | |
col <- c(seqhcl(i, p["h1"], if(is.na(p["h2"])) p["h1"] else p["h2"], p["c1"], p["c2"], p["l1"], p["l2"], p["p1"], p["p2"], p["cmax1"]), | |
rev(seqhcl(i, p["h3"], if(is.na(p["h2"])) p["h3"] else p["h2"], p["c3"], p["c2"], p["l3"], p["l2"], p["p3"], p["p4"], p["cmax2"]))) | |
if(floor(n/2) < n2) col <- col[-n2] | |
} | |
if(rev) col <- rev(col) | |
return(col) | |
} |