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

时间:2015-02-11 18:08:46

标签: r colors

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

例如,请考虑以下颜色:

rainbow(4)
# "#FF0000FF" "#80FF00FF" "#00FFFFFF" "#8000FFFF"

他们的名字是什么(希望每个代码都有名称)?

我发现了函数col2rgb(),但它并不代表我需要的东西。

3 个答案:

答案 0 :(得分:6)

您可以使用color.id包*:

中的便捷功能plotrix
  

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

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

* Jim Lemon的致谢及其答案:Convert color hex code to color names

答案 1 :(得分: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>

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

  

三种R颜色规格中的任何一种的矢量,即   颜色名称(由colors()列出),十六进制字符串   形式&#34; #rrggbb&#34;或&#34; #rrggbbaa&#34; (见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))

答案 2 :(得分:3)

可能更好的方法,但这里有一个使用索引:

colors()[match(rgb(t(col2rgb(rainbow(4))), 
    maxColorValue = 255), c(rgb(t(col2rgb(colors())), maxColorValue = 255)))]


## [1] "red"  NA     "cyan" NA