Skip to contents

Create color complement by rotating the color hue

Usage

color_complement(
  color,
  Hflip = 180,
  Cfloor = NULL,
  Crange = c(5, 100),
  Lrange = c(10, 95),
  Cgrey = getOption("jam.Cgrey", 5),
  preset = getOption("colorjam.preset", "dichromat"),
  useWarpHue = TRUE,
  use_hsl = FALSE,
  verbose = FALSE,
  ...
)

Arguments

color

character vector of R compatible colors.

Hflip

numeric value in degrees (from 0 to 360) added to the color hue to produce the final color hue. Typically 180 degrees will select the color opposite the input color on a virtual color wheel. Note that warpHue=TRUE also enables a customized color wheel.

Cfloor

numeric deprecated in favor of Crange, however when Cfloor is provided, it is given priority over Crange. value used to limit output chroma C values to this minimum value, to ensure a minimum color saturation.

Crange

numeric vector with the permitted range of output color chroma C values. When supplied, output values are forced to this range with no other scaling of intermediate values. Note that input colors at or below chroma Cgrey are considered greyscale and are not complemented.

Lrange

numeric vector with the permitted range of output luminance L values. When supplied, output values are simply forced to this range with no other scaling of intermediate values.

Cgrey

numeric color chroma, at or below which a color is considered greyscale, therefore the color hue is not relevant, and the Crange is not applied.

useWarpHue

logical indicating whether to use the warp hue functions colorjam::h2hw() and colorjam::hw2h() which effectively change the color wheel from red-green-blue to red-yellow-blue.

...

additional arguments are ignored.

Value

character vector of complementary colors.

Details

This function rotates the color hue to create a complementary color for each color input. It differs from standard methods by using warped color hue by default (useWarpHue=TRUE), which uses a red-yellow-blue color wheel instead of R default red-green-blue. It also imposes a minimum chroma, which ensures the output color is reasonably high in color saturation.

Examples

n <- 5;
rc <- colorjam::rainbowJam(n);
rc_comp <- color_complement(rc, preset="dichromat");
rc_comp2 <- color_complement(rc, preset="dichromat", useWarpHue=FALSE);
rc_comp3 <- color_complement(rc, preset="ryb");
jamba::showColors(list(rainbowJam=rc,
   `complement\n(preset="dichromat")`=rc_comp,
   `complement\n(useWarpHue=FALSE)`=rc_comp2,
   `complement\n(preset="ryb")`=rc_comp3));


rc <- colorjam::rainbowJam(n, preset="ryb");
rc_comp <- color_complement(rc, preset="ryb");
jamba::showColors(list(`rainbowJam\n(preset="ryb")`=rc,
   `complement\n(preset="ryb")`=rc_comp));


## divergent color gradients through white
## hint: use higher lens value to make middle colors more intense
rc <- colorjam::rainbowJam(n);
rc_comp <- color_complement(rc);
rc_ramps <- lapply(jamba::nameVector(seq_along(rc)), function(i){
   j <- jamba::getColorRamp(c(rc[i], "white", rc_comp[i]),
      n=25,
      lens=0,
      divergent=TRUE);
   names(j) <- "";
   names(j)[1] <- "original colors";
   names(j)[25] <- "color complements";
   j;
});
jamba::showColors(rc_ramps, groupCellnotes=TRUE, groupByColors=FALSE);


## divergent color gradients through black
## hint: use higher lens value to make middle colors more intense
rc_ramps2 <- lapply(jamba::nameVector(seq_along(rc)), function(i){
   j <- jamba::getColorRamp(c(rc[i], "black", rc_comp[i]),
      n=25,
      lens=1,
      divergent=TRUE);
   names(j) <- "";
   names(j)[1] <- "original colors";
   names(j)[25] <- "color complements";
   j;
});
jamba::showColors(rc_ramps2, groupCellnotes=TRUE, groupByColors=FALSE);


# test divergent color gradient
RdBu_r <- jamba::getColorRamp("RdBu_r");
rc_divergent <- color_complement(RdBu_r)
jamba::showColors(list(RdBu_r=RdBu_r, complement=rc_divergent));