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

voase2hg  于 2023-03-05  发布在  其他
关注(0)|答案(4)|浏览(256)

如何将颜色的十六进制表示转换为相应的名称?
例如,请考虑以下颜色:

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

它们的名称是什么(希望每个代码都有一个名称)?
我发现了col2rgb()函数,但它并不完全是我所需要的。

k3bvogb1

k3bvogb11#

您可以使用plotrix软件包 * 中的便捷函数color.id
给定指定为十六进制字符串的颜色,在已知(命名)颜色表中查找最接近的匹配。

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

rqcrx0a62#

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

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()列出)、“#rrggbb”或“#rrggbaa”形式的十六进制字符串(参见rgb)或表示palette()[i]的正整数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))
2ic8powd

2ic8powd3#

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

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

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

rqenqsqc4#

这是一个更“简洁”的解决问题的方法。它为RGB十六进制代码和颜色名称(来自colors())创建了一个查找表。

library(tidyverse)

color_lookup <- colors(distinct = TRUE) |> 
  enframe() |> 
  rename(color_name = value) |> 
  select(color_name) |> 
  mutate(rgb = map(color_name, col2rgb),
         red = map_int(rgb, 1),
         green = map_int(rgb, 2),
         blue = map_int(rgb, 3),
         rgb_hex = pmap_chr(list(red, green, blue), .f = ~rgb(..1, ..2, ..3, maxColorValue = 255)))

# A tibble: 502 x 6
   color_name    rgb             red green  blue rgb_hex
   <chr>         <list>        <int> <int> <int> <chr>  
 1 white         <int [3 x 1]>   255   255   255 #FFFFFF
 2 aliceblue     <int [3 x 1]>   240   248   255 #F0F8FF
 3 antiquewhite  <int [3 x 1]>   250   235   215 #FAEBD7
 4 antiquewhite1 <int [3 x 1]>   255   239   219 #FFEFDB
 5 antiquewhite2 <int [3 x 1]>   238   223   204 #EEDFCC
 6 antiquewhite3 <int [3 x 1]>   205   192   176 #CDC0B0
 7 antiquewhite4 <int [3 x 1]>   139   131   120 #8B8378
 8 aquamarine    <int [3 x 1]>   127   255   212 #7FFFD4
 9 aquamarine2   <int [3 x 1]>   118   238   198 #76EEC6
10 aquamarine3   <int [3 x 1]>   102   205   170 #66CDAA
# ... with 492 more rows

然后你可以用你的RGB十六进制代码做一个left_join来得到相关的颜色名称(如果它存在于colors()中)

相关问题