Hi John
This has been an interesting discussion.
Though you have a solution for your needs, you might be interested in this javascript implementation that allows you to visually compare color distances in various color spaces

http://stevehanov.ca/blog/index.php?id=116

And, all the theory of color distance is described in
http://en.wikipedia.org/wiki/Color_difference

PS: This is a very handy function.  When I last tried
aplpack::bagplot(), it was annoying that the colors could *only*
be specified in hex.

-Michael



On 5/30/2013 5:14 PM, John Fox wrote:
Dear all,

My thanks to everyone who addressed my question. I've incorporated Eik
Vettorazzi's suggestion for improved conversion of hexadecimal RGB colours
to decimal numbers, and Martin Maechler's hint to look at demo(colors). I've
loosened the default definition of "close enough" from the latter, since the
following seems to work well for my purposes.

r2c <- function(){
     hex2dec <- function(hexnums) {
         # suggestion of Eik Vettorazzi
         sapply(strtoi(hexnums, 16L), function(x) x %/% 256^(2:0) %% 256)
     }
     findMatch <- function(dec.col) {
         sq.dist <- colSums((hsv - dec.col)^2)
         rbind(which.min(sq.dist), min(sq.dist))
     }
     colors <- colors()
     hsv <- rgb2hsv(col2rgb(colors))
     function(cols, near=0.25){
         cols <- sub("^#", "", toupper(cols))
         dec.cols <- rgb2hsv(hex2dec(cols))
         which.col <- apply(dec.cols, 2, findMatch)
         matches <- colors[which.col[1, ]]
         unmatched <- which.col[2, ] > near^2
         matches[unmatched] <- paste("#", cols[unmatched], sep="")
         matches
     }
}

rgb2col <- r2c()

For example,

rgb2col(c("010101", "EEEEEE", "AA0000", "00AA00", "0000AA", "AAAA00",
"AA00AA", "00AAAA"))
[1] "black"         "gray93"        "darkred"       "green4"
[5] "blue4"         "darkgoldenrod" "darkmagenta"   "cyan4"

rgb2col(c("010101", "090909", "090000", "000900", "000009", "090900",
"090009", "000909"))
[1] "black"   "gray3"   "#090000" "#000900" "#000009" "#090900"
[7] "#090009" "#000909"

Thanks again,
  John


--
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept. & Chair, Quantitative Methods
York University      Voice: 416 736-2100 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to