有时需要十几二十个配色,但是一般的配色方案只有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多个颜色后才会出现这些问题。估计也很少需要用到这么多颜色的吧!