将十六进制颜色代码转换为颜色名称

Rem*_*i.b 7 r colors

如何将颜色的十六进制表示转换为其对应的名称?

例如,请考虑以下颜色:

rainbow(4)
# "#FF0000FF" "#80FF00FF" "#00FFFFFF" "#8000FFFF"
Run Code Online (Sandbox Code Playgroud)

它们的名称是什么(希望每个代码都存在名称)?

我发现了这个功能,col2rgb()但它不能满足我的需求.

Hen*_*rik 6

您可以使用便利功能color.idplotrix包*:

给定指定为十六进制字符串的颜色,找到已知(命名)颜色表中最接近的匹配项.

library(plotrix)
sapply(rainbow(4), color.id)
# $`#FF0000FF`
# [1] "red"  "red1"
# 
# $`#80FF00FF`
# [1] "chartreuse"  "chartreuse1"
# 
# $`#00FFFFFF`
# [1] "cyan"  "cyan1"
# 
# $`#8000FFFF`
# [1] "purple"
Run Code Online (Sandbox Code Playgroud)

*Jim Lemon的致谢及其答案:将颜色十六进制代码转换为颜色名称.


Mar*_*pov 5

也许不是最优雅的解决方案,但它应该完成工作:

color.names <- function(d) {
  # get RGB components of d and convert to data frame
  z2 <- as.data.frame(t(col2rgb(d)))

  # get RGB components of standard colors and convert them to data frame
  z <- as.data.frame(t(sapply(colors(distinct=T),col2rgb)))
  colnames(z) <- colnames(z2)
  z$name <- rownames(z)

  # EDIT: original answer used 'merge', which messed up the order
  library(dplyr)
  z2 %>% left_join(z) %>% select(name) 

}

color.names(rainbow(4))
#   name
# 1  red
# 2 <NA>
# 3 cyan
# 4 <NA>
Run Code Online (Sandbox Code Playgroud)

该函数color.names使用相同的输入col2rgb,即

三种R颜色规范中的任何一种的矢量,即颜色名称(由colors()列出),形式为"#rrggbb"或"#rrggbbaa"的十六进制字符串(参见rgb),或者是正数整数i表示palette()[i].

所以你可以用它来获取标准颜色的名称 color.names(1:8)

为了提高计算效率,可以预先计算标准颜色的数据集,如下例所示:

init.color.names <- function() {
  z <- as.data.frame(t(sapply(colors(distinct=T),col2rgb)))
  colnames(z) <- colnames(z2)
  z$name <- rownames(z)
  library(dplyr)

  function(d) {
    z2 <- as.data.frame(t(col2rgb(d)))     
    z2 %>% left_join(z) %>% select(name)   }
}
cl <- init.color.names()
cl(1:3)
cl(rainbow(4))
Run Code Online (Sandbox Code Playgroud)