R快速获取配色方案(16进制颜色代码)

有时需要十几二十个配色,但是一般的配色方案只有10个左右。用连续型的颜色方案虽然可以轻松获得很多配色,但是相邻变量的差异不够很难用于观察,尤其对于堆积图等。简而言之,目前现有包内置的配色方案难以满足一些场景的应用要求,所以就写了这个代码自动生成16进制代码的脚本

使用方法:直接加载函数,然后运行getcolor_list函数即可。
n是需要的颜色个数;colorType是选择离散型或者连续型的选项 "Discrete" "Continuous";后者起始在其他配色函数里都可以实现。主要是想获得离散型配色。

注:这个方案的配色方案个人觉得只是方便过程分析观察所需的。要是文章的话还是参考现成的配色方案或者自己设计吧。我这个本质只是一个随机配色而已

为方便使用已经将代码打包成R包上传至GitHub但是不知道为啥不能使用devtools直接远程安装,但是可以手动下载到本地,然后devtools::install_local("压缩包路径")安装一下即可

本地安装方法

devtools::install_local("G:\\R\\Rworkspace\\脚本文件库\\fastGetColors_0.0.0.9000.tar.gz")

[图片上传中...(image.png-662b9b-1723793838434-0)]

library(fastGetColors)
n=10
colorType="colorType"
fastGetColors::getcolor_list(10)#即可

output:

fastGetColors::getcolor_list(10)
 [1] "#00E11D" "#2E00D0" "#7B0083" "#C70037" "#15E900" "#619D00" "#AE5000" "#FA0400" "#0048B6" "#00946A"
基本效果
#R快速配色方案
getcolor_list<- function(n,colorType= "Discrete",base_randseed=10,k = 24){
  if(colorType=="Discrete"){
    n_yushu <- n %% k
    n_zhengchu <- floor(n/k)
    if(n_zhengchu>5){
      print("too many colors need!")
    } else {
      color <- getcolor_Discrete(n_yushu,n_zhengchu,base_randseed,k)
    }
  }
  if(colorType=="Continuous"){
    angle <- c(1:n)*(120/n)+base_randseed
    color<- as.character(matrix(0,n,1))
    for (jk in 1:n) {
      color[jk] <- angle2color(angle[jk],n_zhengchu=0,base_randseed)
    }
  }
  return(color)
}

getcolor_Discrete <- function(n_yushu,n_zhengchu,base_randseed,k){
  n <- n_zhengchu*k+n_yushu
  color_list <- as.data.frame(matrix(0,n,2))
  colnames(color_list) <- c("angle","cengshu")
  tmp <- 180/k
  if(n_zhengchu>=1){
    for (i in 0:(n_zhengchu-1)) {
      color_list$cengshu[(1+i*k):(k+i*k)] <- i
      color_list$angle[(1+i*k):(k+i*k)] <- ((360/k)*c(1:k)+tmp*i+80*rep(c(-2,-1,0,1,2),times = k)[1:k])%%360
    }
    color_list$cengshu[(1+k+i*k):n] <- n_zhengchu
    color_list$angle[(1+k+i*k):n] <-((360/n_yushu)*c(1:n_yushu)+tmp*i+80*rep(c(-2,-1,0,1,2), times = n_yushu)[1:n_yushu])%%360
  } else {color_list$cengshu[1:n] <- n_zhengchu
  color_list$angle[1:n] <-((360/n_yushu)*c(1:n_yushu)+180)%%360}
  color <- c()
  for (ij in 1:n) {
    color <- c(color,angle2color(color_list$angle[ij],color_list$cengshu[ij],base_randseed))
  }
  return(color)
}
# 使用 rgb() 函数将 RGB 值转换为 16 进制颜色代码
rgb_to_hex <- function(r, g, b) {
  rgb(r, g, b, maxColorValue = 255)
}
angle2color <- function(angle,n_zhengchu,base_randseed=0){
  
  R <- 0
  G <- 0
  B <- 0
  angle <- (angle+ base_randseed)%%360 #角度不应该超过360度
  color_group <- floor(angle/120)#0-120R 0 ;120-240G 1 ;240-360B 2;
  color_presence <- (angle%%120)/120
  if (color_group==0) {
    B <- n_zhengchu*45
    G <- (1-color_presence)*255
    R <- color_presence*255
  }else if(color_group==1){
    R <- n_zhengchu*45
    B <- (1-color_presence)*255
    G <- color_presence*255
  } else {
    G <- n_zhengchu*45
    B <- (1-color_presence)*255
    R <- color_presence*255
  }
  R <- floor(R)
  B <- floor(B)
  G <- floor(G)
  color_16number <- rgb_to_hex(R,G,B)
  return(color_16number)
}

getcolor_list(20,colorType="Continuous") #连续型颜色

getcolor_list(90,colorType="Discrete",base_randseed=10,k = 24) #离散型颜色


目前仍有一点bug,颜色一多就容易得到相同的色号。这应该是取整操作导致的难以避免。通常在需要50多个颜色后才会出现这些问题。估计也很少需要用到这么多颜色的吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容