如何将颜色的十六进制表示转换为相应的名称?
例如,请考虑以下颜色:
rainbow(4)
# "#FF0000FF" "#80FF00FF" "#00FFFFFF" "#8000FFFF"
他们的名字是什么(希望每个代码都有名称)?
我发现了函数col2rgb()
,但它并不代表我需要的东西。
答案 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