给定一个有限的调色板,如何从热到冷排序,即发散

Art*_*die 8 rgb r hsv color-theory

更新(原始问题如下)

问题部分解决了.

仍试图弄清楚如何扩展到其他颜色组合

如果我使用此代码

hLIM <- rgb2hsv(col2rgb('#8000ff'))['h', ]
sLIM <- rgb2hsv(col2rgb('#8000ff'))['s', ]
vLIM <- rgb2hsv(col2rgb('#8000ff'))['v', ]
rankorder <- order((hLIM-tHSVcol[,1] + (hLIM < tHSVcol[,1])),
                   (sLIM-tHSVcol[,2] + (sLIM < tHSVcol[,2])),
                   (vLIM-tHSVcol[,3] + (vLIM < tHSVcol[,3])))

orderType <- "HSV Ordering"
Run Code Online (Sandbox Code Playgroud)

我能够对此进行排序

在此输入图像描述

未排序的调色板:

"#313695","#fdae61","#a50026","#ffffbf","#f46d43","#fee090","#e0f3f8","#74add1","#d73027","#4575b4","#abd9e9"

进入这个

在此输入图像描述

分类调色板:

"#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1", "#4575b4","#313695"

但是,我很难将其扩展到其他颜色组合.

对于实例,当我尝试对此进行排序时

在此输入图像描述

未分类

"#22325f" "#88ce64" "#fbd234" "#b8091f" "#682f4e" "#fdea6e" "#4aec6a" "#fb7894" "#f13111" "#2584a0" "#460809" "#00699e" "#391b72" "#03471d" "#ba0841"
Run Code Online (Sandbox Code Playgroud)

我明白了(有趣的部分是,我不确定完美排序的调色板会是什么样子----当然没有黑色条带穿插!)

在此输入图像描述

不完美的排序

"#391b72" "#22325f" "#00699e" "#2584a0" "#03471d" "#4aec6a" "#88ce64" "#fdea6e" "#fbd234" "#f13111" "#460809" "#b8091f" "#fb7894" "#ba0841" "#682f4e"
Run Code Online (Sandbox Code Playgroud)


原始问题

我有一个有限的调色板,如何从Hot(红色)到Cold(蓝色)排序.

我怎么转这个

在此输入图像描述

未排序的调色板:

"#313695","#fdae61","#a50026","#ffffbf","#f46d43","#fee090","#e0f3f8","#74add1","#d73027","#4575b4","#abd9e9"

进入这个

在此输入图像描述

分类调色板:

"#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1", "#4575b4","#313695"

R代码位于消息的末尾.我试图通过组合排序RGBHSV(基于什么评论,或取消注释),但无济于事.

我无法在以下值中找到模式(颜色分散排序)

非常感谢任何指导.

RGB分类颜色

> tRGBcol
      red green blue
 [1,] 165     0   38
 [2,] 215    48   39
 [3,] 244   109   67
 [4,] 253   174   97
 [5,] 254   224  144
 [6,] 255   255  191
 [7,] 224   243  248
 [8,] 171   217  233
 [9,] 116   173  209
[10,]  69   117  180
[11,]  49    54  149
Run Code Online (Sandbox Code Playgroud)

HSV分类颜色

> tHSVcol
                h          s         v
 [1,] 0.961616162 1.00000000 0.6470588
 [2,] 0.008522727 0.81860465 0.8431373
 [3,] 0.039548023 0.72540984 0.9568627
 [4,] 0.082264957 0.61660079 0.9921569
 [5,] 0.121212121 0.43307087 0.9960784
 [6,] 0.166666667 0.25098039 1.0000000
 [7,] 0.534722222 0.09677419 0.9725490
 [8,] 0.543010753 0.26609442 0.9137255
 [9,] 0.564516129 0.44497608 0.8196078
[10,] 0.594594595 0.61666667 0.7058824
[11,] 0.658333333 0.67114094 0.5843137
Run Code Online (Sandbox Code Playgroud)

手动拆分十六进制颜色

a5  00  26
d7  30  27
f4  6d  43
fd  ae  61
fe  e0  90
ff  ff  bf
e0  f3  f8
ab  d9  e9
74  ad  d1
45  75  b4
31  36  95
Run Code Online (Sandbox Code Playgroud)

RenderPal <- function(x,name){

  if ((missing(x)) || (missing(name))){
    stop("Internal error, please troubleshoot")
  }
  n <- length(x)
  old <- graphics::par(mar = c(0.5, 0.5, 0.5, 0.5))
  on.exit(graphics::par(old))

  graphics::image(1:n, 1, as.matrix(1:n), col = x,
                  ylab = "", xaxt = "n", yaxt = "n", bty = "n")
  graphics::rect(0, 0.9, n + 1, 1.1, col = grDevices::rgb(1, 1, 1, 0.8), border = NA)
  graphics::text((n + 1) / 2, 1, labels = name, cex = 2, family = "serif")
}

i <- NULL
oldPal <- NULL
rankorder <- c(1,2,3,4,5,6,7,8,9,10,11)
orderedPal<- NULL
RGBcol <- NULL
HSVcol <- NULL
tHSVcol <- NULL
orderType <- "Unsorted"



oldPal <- c("#313695","#fdae61","#a50026","#ffffbf","#f46d43","#fee090","#e0f3f8","#74add1","#d73027","#4575b4","#abd9e9")

# Print hex values
oldPal

# Convert Hex to RGB
RGBcol <- col2rgb(oldPal)

# Print RGB values
RGBcol

# Transpose matrix
tRGBcol <- t(RGBcol)

# Print matrix
tRGBcol

# Uncomment following to order by Red, Green, then Blue
# rankorder <- order(tRGBcol[,1],tRGBcol[,2],tRGBcol[,3])
# orderType <- "Red Ordering"

# Uncomment following to order by Blue, Green, then Red
# rankorder <- order(tRGBcol[,3],tRGBcol[,2],tRGBcol[,1])
# orderType <- "Blue Ordering"

# Uncomment following to order by Green, Blue then Red
# rankorder <- order(tRGBcol[,2],tRGBcol[,3],tRGBcol[,1])
# orderType <- "Green Ordering"

# Uncomment following to order by Red + Blue
# rANDb <- apply(tRGBcol[,c(1,3)],1,sum)
# rankorder <- order(rANDb)
# orderType <- "Red + Blue Ordering"

# Uncomment following to order by Red + Green + Blue
# rANDgANDb <- apply(tRGBcol[,c(1,2,3)],1,sum)
# rankorder <- order(rANDgANDb)
# orderType <- "Red + Green + Blue Ordering"

# Convert RGB to HSV
HSVcol <- rgb2hsv(RGBcol)

# Print matrix
HSVcol

# Transpose matrix
tHSVcol <- t(HSVcol)

# Print matrix
tHSVcol


# Uncomment following to order by Hue, then Saturation, then Value
# rankorder <- order(tHSVcol[,1],tHSVcol[,2],tHSVcol[,3])
# orderType <- "Hue Ordering"

# Uncomment following to order by hANDv = Hue + Value
# hANDv <- apply(tHSVcol[,c(1,3)],1,sum)
# rankorder <- order(hANDv)
# orderType <- "Hue + Value Ordering"

# Uncomment following to order by hPRODv = Hue * Value
# hPRODv <- apply(tHSVcol[,c(1,3)],1,prod)
# rankorder <- order(hPRODv)
# orderType <- "Hue * Value Ordering"

# Combine matrices tRGBcol and tHSVcol
tCombo <- cbind(tRGBcol,tHSVcol)

rankorder

for (i in 1:length(rankorder)){
  orderedPal[i] <- oldPal[rankorder[i]]
}

# Print old, unordered palette
oldPal

# Print new, ordered palette
orderedPal

RenderPal(oldPal, "Unordered Palette")
RenderPal(orderedPal, orderType)
Run Code Online (Sandbox Code Playgroud)

编辑:当我按顺序排序时的结果

在此输入图像描述

G5W*_*G5W 2

我几乎收到了您要求的订单:

Coolness = function(P) { 
    RGB = col2rgb(P)
    (RGB[3,] - RGB[1,]) / (RGB[3,] + RGB[1,])
}

CoolPal = oldPal[order(Coolness(oldPal))]
RenderPal(CoolPal, "Coolness")
Run Code Online (Sandbox Code Playgroud)

调色板 按酷感排序

但请注意,我已经交换了前两种颜色。您建议的答案是“#a50026”比“#d73027”更热。我的 Coolness 函数对这两个函数的排序相反。