This work-in-progress R package helps calculate color-contrast values so you can make decisions to improve the visual accessibility of your R outputs. You can read a blog post about it.

It was originally developed with the need for selecting high-contrast text colors for use on block-colored backgrounds. The ultimate aim is to create a tool for compliance with WCAG 3.0.

Feel free to add an issue or a make a pull request. Please follow the code of conduct.

Similar tools

The {savonliquide} package by Ihaddaden M. El Fodil achieves the main aim of this package using the WebAIM contrast checker API. It’s available on CRAN.


You can install the development version of {coloratio} from GitHub with:



Get contrast ratio

The cr_get_ratio() function returns the color-contrast ratio of two user-provided colors. You can provide hex values, named colors, or both.

cr_get_ratio("#000000", "white")
# [1] 21

You should aim for a value of 4.5 or greater. You’ll get a warning if the contrast between the colors is insufficient.

cr_get_ratio("black", "grey10")
# Warning in cr_get_ratio("black", "grey10"): Aim for a value of 4.5 or higher.
# [1] 1.206596

Read more about the calculation in the WCAG 2.1 guidance.

Color contrast demo

cr_get_ratio() also lets you view a plot of text on a block background using the supplied colors by setting view = TRUE.

cr_get_ratio("#000000", "olivedrab", view = TRUE)

# [1] 5.51863

You can access this visual functionality in isolation with cr_view_contrast().

cr_view_contrast("blue4", "sienna1")

Choose black or white

You may want to alter programmatically the color of overlaying elements when the underlying color varies. For example, when putting text over the bars of a grouped bar chart.

The function cr_choose_bw() returns "white" or "black" depending on which has the better contrast ratio with the user-supplied color.

# Supply a character vector, receive a character vector
cr_choose_bw(c("gray10", "gray90", "lightyellow"))
# [1] "white" "black" "black"

Black is chosen in the event of a tie.

Choose a high-contrast color

You can use cr_choose_color() to check a user-supplied color against all named R colors and return those with greatest contrast.

# [1] "white"

  col = "olivedrab",  # user-supplied color
  n = 3,              # number of colors to return
  ex_bw = TRUE        # exclude black, whites, grays?
# [1] "navy"     "navyblue" "blue4"

You have the option to exclude black, whites and grays from being returned (via the ex_bw argument) because they’re boring.

Code of Conduct

Please note that the {coloratio} project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.