【问题标题】:Convert hex color code to color name将十六进制颜色代码转换为颜色名称
【发布时间】:2015-04-12 05:39:30
【问题描述】:

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

例如,考虑以下颜色:

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

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

我发现了函数col2rgb(),但它并不完全符合我的需要。

【问题讨论】:

  • 废弃一个十六进制颜色数据帧,然后在这个查找表中获取颜色名称。

标签: r colors


【解决方案1】:

您可以使用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"

*感谢 Jim Lemon 和他的回答:Convert color hex code to color names

【讨论】:

    【解决方案2】:

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

    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”或“#rrggbbaa”(参见 rgb),或正整数 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))
    

    【讨论】:

    • 看起来不错。谢谢你。 “NA”表示此特定代码不存在名称?我猜想通过一个循环,人们可能会寻找有名字的密切相关的颜色。
    • 是的,“NA”表示没有匹配的颜色。关于密切相关的颜色是一个有趣的想法,但我不确定如何正确定义颜色之间的距离。
    • 你只想得到三个值并计算欧几里得距离
    【解决方案3】:

    可能更好的方法,但这是使用索引的方法:

    colors()[match(rgb(t(col2rgb(rainbow(4))), 
        maxColorValue = 255), c(rgb(t(col2rgb(colors())), maxColorValue = 255)))]
    
    
    ## [1] "red"  NA     "cyan" NA 
    

    【讨论】:

    • 'col2hex' 来自什么包?
    • colors()[match(rainbow(4), paste0(col2hex(colors()),'FF'))] 替代您的答案
    • @MaratTalipov 我自己的reports 包。我并不是想把它作为答案。
    猜你喜欢
    • 2011-12-09
    • 2021-11-26
    • 2017-04-14
    • 2016-05-11
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多