2015-02-11 203 views
4

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

例如,请考虑以下颜色:

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

他们叫什么名字(希望的名称存在每个代码)?

我发现了功能col2rgb(),但它并不暗示我所需要的。

+1

废弃十六进制颜色数据帧,然后在此查找表中获取颜色名称。 – 2015-02-11 18:16:36

回答

2

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

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

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

*学分吉姆柠檬和他的答案在这里:Convert color hex code to color names

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颜色规范,即 或者颜色名称(如颜色()列出),十六进制字符串 形式“#rrggbb”或“#rrggbbaa”(请参阅​​rgb),或者一个正整数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)) 
+0

看起来不错。谢谢。 “NA”意味着此特定代码不存在任何名称?我想通过一个循环,人们可能会寻找与名称密切相关的颜色。 – 2015-02-11 18:25:56

+0

是的,“NA”表示没有匹配的颜色,关于密切相关的颜色是一个有趣的想法,但我不太确定如何正确定义颜色之间的距离 – 2015-02-11 18:35:07

+0

您只需要获取三个值并计算欧几里德距离 – OganM 2015-02-11 21:13:50

3

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

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


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

'col2hex'是什么包? – 2015-02-11 19:06:44

+1

'colors()[match(rainbow(4),paste0(col2hex(colors()),'FF'))]''作为您的答案的替代 – 2015-02-11 19:14:17

+0

@MaratTalipov我自己的'report'包,我不是想把它作为答案。 – 2015-02-11 21:21:41

相关问题