如何将颜色的十六进制表示转换为其对应的名称?
例如,请考虑以下颜色:
rainbow(4)
# "#FF0000FF" "#80FF00FF" "#00FFFFFF" "#8000FFFF"
Run Code Online (Sandbox Code Playgroud)
它们的名称是什么(希望每个代码都存在名称)?
我发现了这个功能,col2rgb()但它不能满足我的需求.
您可以使用便利功能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"
Run Code Online (Sandbox Code Playgroud)
*Jim Lemon的致谢及其答案:将颜色十六进制代码转换为颜色名称.
也许不是最优雅的解决方案,但它应该完成工作:
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)
| 归档时间: |
|
| 查看次数: |
5405 次 |
| 最近记录: |