Skip to contents

Convert Color Values into Color Names

The colornames R package aims to convert color values into color names using various APIs:

Installation

install.packages("colornames")

#install.packages("devtools")
devtools::install_github("lgnbhl/colornames") # from GitHub

Minimal examples

Color name using thecolorapi’s API.

get_color_thecolorapi(hex = "#0047AB")
## [1] "Cobalt"

Color name using colornames’s API.

get_color_colornames(hex = "#0047AB")
## [1] "Cobalt Blue"

Color name using color.pizza’s API.

get_color_colorpizza(hex = "#0047AB")
## [1] "Soulstone Blue"

thecolorapi.com API

Call get_color_thecolorapi() to get the closest color name available of a hex code.

get_color_thecolorapi(hex = "#0047AB")
## [1] "Cobalt"

The “thecolorapi.com” API return a list of variables about a given color name, by using return_name_only = FALSE.

col1 <- get_color_thecolorapi(hex = "#0047AB", return_name_only = FALSE)

str(col1, max.level = 1)
## List of 11
##  $ hex      :List of 2
##  $ rgb      :List of 5
##  $ hsl      :List of 5
##  $ hsv      :List of 5
##  $ name     :List of 4
##  $ cmyk     :List of 6
##  $ XYZ      :List of 5
##  $ image    :List of 2
##  $ contrast :List of 1
##  $ _links   :List of 1
##  $ _embedded: Named list()

You can create a data.frame from this list.

as.data.frame(col1[1:9])
##   hex.value hex.clean rgb.fraction.r rgb.fraction.g rgb.fraction.b rgb.r rgb.g
## 1   #0047AB    0047AB              0      0.2784314      0.6705882     0    71
##   rgb.b       rgb.value hsl.fraction.h hsl.fraction.s hsl.fraction.l hsl.h
## 1   171 rgb(0, 71, 171)      0.5974659              1      0.3352941   215
##   hsl.s hsl.l           hsl.value hsv.fraction.h hsv.fraction.s hsv.fraction.v
## 1   100    34 hsl(215, 100%, 34%)      0.5974659              1      0.6705882
##             hsv.value hsv.h hsv.s hsv.v name.value name.closest_named_hex
## 1 hsv(215, 100%, 67%)   215   100    67     Cobalt                #0047AB
##   name.exact_match_name name.distance cmyk.fraction.c cmyk.fraction.m
## 1                  TRUE             0               1       0.5847953
##   cmyk.fraction.y cmyk.fraction.k           cmyk.value cmyk.c cmyk.m cmyk.y
## 1               0       0.3294118 cmyk(100, 58, 0, 33)    100     58      0
##   cmyk.k XYZ.fraction.X XYZ.fraction.Y XYZ.fraction.Z       XYZ.value XYZ.X
## 1     33      0.2206082      0.2475506      0.6705831 XYZ(22, 25, 67)    22
##   XYZ.Y XYZ.Z                                                       image.bare
## 1    25    67 https://www.thecolorapi.com/id?format=svg&named=false&hex=0047AB
##                                            image.named   value
## 1 https://www.thecolorapi.com/id?format=svg&hex=0047AB #ffffff

You can get color names from different color convention, i.e. rgb, hsl or cmyk.

get_color_thecolorapi(rgb = paste(3,60,71, sep = ","))
## [1] "Blue Whale"
get_color_thecolorapi(hsl = paste("100","100%","34%", sep = ","))
## [1] "Limeade"
get_color_thecolorapi(cmyk = paste(50,58,0,33, sep = ","))
## [1] "Plump Purple"

You can get color names from an existing list of colors using the closest named hex available.

library(scales)
library(purrr)

pal_hue <- scales::brewer_pal()(6)

pal_names <- purrr::map_chr(.x = pal_hue, .f = get_color_thecolorapi)

data.frame(
  hex = pal_hue,
  name = pal_names
)
##       hex           name
## 1 #EFF3FF         Zircon
## 2 #C6DBEF        Spindle
## 3 #9ECAE1 Regent St Blue
## 4 #6BAED6     Aqua Pearl
## 5 #3182BD          Denim
## 6 #08519C    Venice Blue

You can also get a color scheme (color palette) from any color.

pal <- get_color_thecolorapi_scheme(
  hex = "0047AB", 
  count = 5, 
  mode = "monochrome", 
  return_name_only = FALSE)

#get closed color name available
# data.frame(
#   hex = pal$colors$hex$value,
#   name = pal$colors$name$value
# )

pal$colors$hex
##     value  clean
## 1 #01122A 01122A
## 2 #02285D 02285D
## 3 #023D8F 023D8F
## 4 #0252C3 0252C3
## 5 #0167F6 0167F6

Note that when an invalid color name is used, the API return “#000000” (black color).

get_color_thecolorapi(hex = "InvalidColorReturnsBlack")
## [1] "Black"

colornames.org API

get_color_colornames(hex = "3D290C")
## [1] "Swiss Dark Chocolate"

The function get_color_colornames() can also return a dataframe using return_name_only = FALSE.

Note that the API returns hex codes as pure numbers, without a starting hashtag “#”

df <- get_color_colornames(hex = "3D290C", return_name_only = FALSE)
#add "#" back in beginning of each hex code
df$hexCode <- paste0("#", df$hexCode)
df
##   hexCode                 name
## 1 #3d290c Swiss Dark Chocolate

Hex codes should always have 6 characters:

get_color_colornames(hex = "440154FF")
# Error: Hex code 440154FF has 8 characters. 
# Hex code should have 6 characters.

You an also get an random color name:

get_color_colornames_random(return_name_only = FALSE)
##   hexCode              name
## 1  c2b4fc French Moon Coord

You can explore the latest 100 submissions:

latest_100 <- get_color_colornames_latest(return_name_only = FALSE)

head(latest_100)
##    nameId hexCode                        name
## 1 5812612  5e65c3          Hazy Indigo Dreams
## 2 5812611  fbeee3           Pale Vampire Skin
## 3 5812610  f7e0cd       Crusty Toenail Yellow
## 4 5812609  e7de7e   Sunny Cotton Candy Yellow
## 5 5812608  4f2c94                      Burple
## 6 5812607  115fae The Mathematician's Secrets

You can loop to get color names of a given palette:

library(scales)
library(purrr)

pal_hue <- scales::brewer_pal()(6)
pal_names <- purrr::map_chr(.x = pal_hue, .f = get_color_colornames)

data.frame(
  hex = pal_hue,
  name = pal_names
)
##       hex                name
## 1 #EFF3FF When I Remember You
## 2 #C6DBEF    Cloud Initiation
## 3 #9ECAE1                <NA>
## 4 #6BAED6                <NA>
## 5 #3182BD                <NA>
## 6 #08519C                <NA>

If color names are missing (like above), you can choose to give them a name.

If for some reason you want to use this color names database into production, you should be aware that the color names are potentially changing as anyone can vote anytime to change any color name. Therefore you should download a copy of the colornames database at a given time.

You can download the complete data and use it locally.

url_data <- "https://colornames.org/download/colornames.zip"
your_file_path <- paste0(getwd(), "/colornames-", Sys.Date(), ".zip")
download.file(url = url_data, destfile = your_file_path)
colornames_df <- readr::read_csv(your_file_path)

# Joke with hex codes 00000 to 00003
colornames_df
# # A tibble: 3,157,757 × 3
#    hex bestName                     votes
#    <chr>   <chr>                        <dbl>
#  1 000000  Dude Turn The Lights Back On  5351
#  2 000001  It's Still Basically Black     729
#  3 000002  Still Black                    121
#  4 000003  So Close To Black It Hurts     145
#  5 000004  Blackerererer                   27
#  6 000005  Jet Black Heart                 16
#  7 000006  Abaddon                         16
#  8 000007  Double O Seven                  56
#  9 000008  Closed Eyes                     26
# 10 000009  Really Dark Blue                29
# # ℹ 3,157,747 more rows

This downloadable data is totally free of rights, under CC0 1.0.

color.pizza API

The color.pizza database is more stable as it is modified only by its core contributors.

You can get the name of of the closest color name with get_color_colorpizza().

get_color_colorpizza(hex = "#3D290C")
## [1] "Black Swan"

You can access different information about a given color using return_name_only = FALSE.

get_color_colorpizza(hex = "#3D290C", return_name_only = FALSE)
##         name     hex rgb.r rgb.g rgb.b hsl.h hsl.s hsl.l   lab.l   lab.a
## 1 Black Swan #332200    51    34     0    40   100    10 14.8627 5.70118
##      lab.b luminance luminanceWCAG bestContrast
## 1 21.82334   25.1168       0.01848        white
##                           swatchImg.svgNamed            swatchImg.svg
## 1 /v1/swatch/?color=3d290c&name=Black%20Swan /v1/swatch/?color=3d290c
##   requestedHex distance
## 1      #3d290c  2.90889

You can get the color names from a unique source with “list” argument and avoid duplicated colors with “noduplicates”.

get_color_colorpizza(
  hex = c("#3D290C","#1c2f11","#2e3f24"),
  list = "wikipedia",
  noduplicates = TRUE,
  return_name_only = FALSE)
##            name     hex
## 1     Café Noir #4b3621
## 2 Phthalo Green #123524
## 3   Rifle Green #444c38
##                                                          link rgb.r rgb.g rgb.b
## 1 https://en.wikipedia.org/wiki/Coffee_(color)#Caf%C3%A9_Noir    75    54    33
## 2        https://en.wikipedia.org/wiki/Phthalocyanine_Green_G    18    53    36
## 3    https://en.wikipedia.org/wiki/Shades_of_green#Mint_green    68    76    56
##   hsl.h    hsl.s    hsl.l    lab.l     lab.a    lab.b luminance luminanceWCAG
## 1    30 38.88889 21.17647 24.64653   7.52734 17.00318  39.01021       0.04244
## 2   151 49.29577 13.92157 19.19804 -16.97218  6.79941  31.83870       0.02802
## 3    84 15.15152 25.88235 31.13019  -6.45902 10.80991  49.44063       0.06683
##   bestContrast                             swatchImg.svgNamed
## 1        white /v1/swatch/?color=3d290c&name=Caf%C3%A9%20Noir
## 2        white  /v1/swatch/?color=1c2f11&name=Phthalo%20Green
## 3        white    /v1/swatch/?color=2e3f24&name=Rifle%20Green
##              swatchImg.svg requestedHex distance
## 1 /v1/swatch/?color=3d290c      #3d290c  5.21463
## 2 /v1/swatch/?color=1c2f11      #1c2f11  7.07137
## 3 /v1/swatch/?color=2e3f24      #2e3f24  6.79268

You can get color names from an existing list of colors using the closest named hex available.

library(purrr)
library(scales)

pal_hue <- scales::brewer_pal()(6)
pal_hue_names <- get_color_colorpizza(hex = pal_hue)

data.frame(
  hex = pal_hue,
  name = pal_hue_names
)
##       hex                 name
## 1 #EFF3FF        Coconut White
## 2 #C6DBEF          Arctic Rain
## 3 #9ECAE1          Legacy Blue
## 4 #6BAED6 Broom Butterfly Blue
## 5 #3182BD          King Triton
## 6 #08519C           USAFA Blue