genomewalker
3/22/2016 - 3:01 PM

Random colors

Random colors

library(grDevices)
library(viridis)
library(scales)
library(tidyr)
library(plyr)
library(dplyr)
library(RColorBrewer)
library(randtoolbox)
library(scales)

# one of my favorite paletets
show_col(colorRampPalette(viridis_pal()(77))(77))

# Take random colors from multiple palettes
get_random_colors <- function(X, Y, seed = NULL){
  
  if (length(unique(X)) < 3){
      stop("At least two palettes", call. = FALSE)
  }
  
  if (Y < 4){
    stop("At least 4 colors", call. = FALSE)
  }
  
  N <- ceiling(Y/length(X))
   
  cols <- function(cols, n, Y){
    b <- colorRampPalette(rev(brewer.pal(9,cols)))(Y)
    l1<-as.data.frame(t(rgb2hsv(col2rgb(b)))) %>% 
      mutate(S = rowSums(.)) %>%
      mutate(N = rownames(.)) %>% 
      filter(v > 0.5, v < 0.95) %>%
      select(N)
    b <- sample(b[as.numeric(l1$N)], N)
  }
  
  l <- unique(unlist(lapply(X, cols, N, Y))) 
  
  if (is.null(seed)){
    seed <- round(as.numeric(Sys.time()))
    set.seed(seed)
    cat(paste("Seed used:", seed))
  }else{
    set.seed(seed)
  }
  
  l1<-as.data.frame(t(rgb2hsv(col2rgb(l)))) %>% 
    mutate(S = rowSums(.)) %>%
    mutate(N = rownames(.)) %>%
    select(N)
  
  l2 <- sample(l[as.numeric(l1$N)], Y)
  return(l2)
}


# Random colors based on the HSV, colors are spaced by different numerical series
sobo_colors<-function(X, seed = NULL){
  
  if (is.null(seed)){
    seed <- sample(round(as.numeric(Sys.time())),1)
  }
  cat(paste("Seed used:", seed))
  
  h<-sort(sobol(X,1,scrambling = 1, seed = seed))
  
  l <- unlist(lapply(h, function(X) hsv(X, 0.5, 0.95)))
  return(l)
}

halton_colors<-function(X){
  h<-sort(halton(X,1, init = FALSE, usetime = TRUE)) 
  l <- unlist(lapply(h, function(X) hsv(X, 0.5, 0.95)))
  return(l)
}

golden_ratio_colors<-function(X, seed = NULL){
  if (is.null(seed)){
    seed <- sample(round(as.numeric(Sys.time())),1)
    set.seed(seed)
  }
  cat(paste("Seed used:", seed))
  
  h <- runif(1)  

  vals <- numeric(X)
  vals[1]<-h
  
  for (i in 2:X) { 
    vals[i] <- vals[i-1] + 0.618033988749895
  }   
  vals <- sort(vals%%1)  
  l <- unlist(lapply(vals, function(X) hsv(X, 0.5, 0.95)))
  return(l)
}

# brew.pal palettes
pals <- c("Blues", "Reds", "Greens", "Oranges", "Purples", "Greys")
pals <- c("BrBG", "PiYG", "PRGn", "PuOr", "RdBu", "RdGy", "RdYlBu", "RdYlGn", "Spectral")
show_col(get_random_colors(pals, 77), labels = FALSE)

show_col(sobo_colors(77), labels = F)
show_col(halton_colors(77), labels = F)
show_col(golden_ratio_colors(77), labels = F)