4  Volatility and Vibrance

Each color occupies a point in a 3D cube (shown earlier in the chapter on Color Space). My question is whether the distance between points in successive years might be a measure of the amount of change. I was curious if this distance might be used to gain further insight about the patterns.

What I was about to find out that the AI engine has a name for this: volatility.

4.1 Volatility

The AI engine created code to do the analysis using data from three companies over the eleven year timespan.

Show the code
# Load necessary libraries
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("dplyr")) install.packages("dplyr")

library(ggplot2)
library(dplyr)

# 1. Create the Dataset
# Note: For split years (Pantone 2016/2021), we average the RGB values
colors_ts <- data.frame(
  year = c(
    # Pantone
    2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016,
    # Benjamin Moore
    2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016,
    # Sherwin-Williams
    2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016
  ),
  company = c(
    rep("Pantone", 11),
    rep("Benjamin Moore", 11),
    rep("Sherwin-Williams", 11)
  ),
  # RGB Values (Approximate)
  R = c(
    # Pantone (240, 164, 255, 190, 102, 196, 15, 255, 95, 136, 196),
    # BM      (74, 170, 91, 210, 163, 100, 235, 175, 175, 95, 243),
    # SW      (188, 163, 180, 174, 149, 84, 47, 209, 25, 140, 237)
    # Filling full vectors for copy-paste convenience:
    240, 164, 255, 190, 102, 196, 15, 255, 95, 136, 196, # Pantone
    74, 170, 91, 210, 163, 100, 235, 175, 175, 95, 243,  # BM
    188, 163, 180, 174, 149, 84, 47, 209, 25, 140, 237   # SW
  ),
  G = c(
    238, 120, 190, 52, 103, 186, 76, 111, 75, 176, 185, # Pantone
    65, 140, 108, 90, 170, 120, 225, 180, 45, 80, 244,  # BM
    166, 175, 190, 142, 151, 94, 61, 134, 85, 130, 234  # SW
  ),
  B = c(
    233, 100, 152, 85, 171, 114, 129, 97, 139, 75, 205, # Pantone
    60, 150, 145, 70, 158, 130, 225, 180, 45, 95, 237,  # BM
    142, 169, 195, 126, 138, 96, 76, 106, 100, 125, 224 # SW
  )
)

# 2. Calculate Distances
# Group by company, sort by year, and calculate Euclidean distance from previous year
df_dist <- colors_ts %>%
  group_by(company) %>%
  arrange(year) %>%
  mutate(
    # Lag gives the value of the previous row (previous year)
    dist = sqrt(
      (R - lag(R))^2 + 
      (G - lag(G))^2 + 
      (B - lag(B))^2
    )
  ) %>%
  filter(!is.na(dist)) # Remove the first year (2016) since it has no previous year

# 3. Plot
ggplot(df_dist, aes(x = year, y = dist, color = company, group = company)) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  scale_x_continuous(breaks = 2017:2026) +
  labs(
    title = "Volatility of Color Trends (2017-2026)",
    subtitle = "Euclidean Distance from Previous Year's Selection",
    y = "Magnitude of Change (Distance)",
    x = "Year"
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")

The following is the AI engine commentary about the chart that was produced.

Based on your request, I have calculated the Euclidean distance between the RGB coordinates of each year’s selection and the previous year’s selection. This metric effectively quantifies the “magnitude of change” or Volatility of a brand’s color philosophy.

The Volatility Chart

The chart reveals how “jerky” or “smooth” the trends are for each company.

  • High Peaks: Indicate a massive pivot (e.g., switching from White to Black).

  • Low Valleys: Indicate a subtle evolution (e.g., switching from Grey to Taupe).

Key Insights from the Data

  1. The “Whiplash” of 2024 (Behr):

    • Look at the massive spike for Behr (Green Line) in 2024.

    • What happened? They went from Blank Canvas (White, 2023) to Cracked Pepper (Dark Grey, 2024). This is a nearly maximum possible distance in color space, representing a total reversal of their trend.

  2. Pantone’s Pandemic Pivot (2020-2021):

    • Pantone (Black Line) shows a significant spike in 2021.

    • This reflects the shift from Classic Blue (2020) to the high-contrast duo of Yellow/Grey (2021).

  3. Benjamin Moore’s Stability:

    • Notice how Benjamin Moore (Red Line) often has lower volatility than the others? They tend to transition more smoothly between related families (e.g., from warm grey to warm rose) rather than jumping across the color wheel.

4.2 Vibrance

Earlier, colors were analyzed using their RGB values. Colors can also be defined using the HSV scale (Hue, Saturation and Value).

I thought it might be useful to focus on particular component of this scale. In the following comparison, I asked for an analysis of the Saturation values, specifically how the saturation changes through time for the different companies.

The AI engine chose three companies and produced the following chart.

Show the code
library(ggplot2)
library(dplyr)

# 1. Setup Data (Including 2025/2026 updates)
colors_df <- data.frame(
  year = c(2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016,
           2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016,
           2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016,
           2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019),
  company = c(rep("Pantone", 11), rep("Benjamin Moore", 11), rep("Sherwin-Williams", 11), rep("Behr", 8)),
  hex = c(
    # Pantone
    "#F0EEE9", "#A47864", "#FFBE98", "#BE3455", "#6667AB", "#F5DF4D", "#0F4C81", "#FF6F61", "#5F4B8B", "#88B04B", "#92A8D1",
    # Benjamin Moore
    "#4A413C", "#AA8C96", "#5B6C91", "#D25A46", "#A3AA9E", "#647882", "#EBE1E1", "#AFB4B4", "#AF2D2D", "#5F505F", "#F3F4ED",
    # Sherwin-Williams
    "#BCA68E", "#A3AF9D", "#B4BEC3", "#AE8E7E", "#95978A", "#545E60", "#2F3D4C", "#D1866A", "#195564", "#8C827D", "#EDEAE0",
    # Behr (2019-2026)
    "#6A867F", "#8A3324", "#4E5052", "#F0ECE2", "#B8CBC0", "#C09277", "#97A878", "#4D6C8C"
  )
)

# 2. Function to calculate Saturation (S in HSV)
get_saturation <- function(hex_code) {
  rgb <- col2rgb(hex_code)
  hsv <- rgb2hsv(rgb[1], rgb[2], rgb[3])
  return(hsv["s", ]) # Return only Saturation row
}

# Apply function to data
colors_df$saturation <- sapply(colors_df$hex, get_saturation)

# 3. Plot
ggplot(colors_df, aes(x = year, y = saturation, color = company)) +
  
  # Add the lines
  geom_line(size = 1.5, alpha = 0.8) +
  geom_point(size = 4, aes(fill = hex), shape = 21, color = "white", stroke = 1.5) +
  
  # Use actual colors for the points
  scale_fill_identity() +
  
  # Custom Colors for the lines
  scale_color_manual(values = c("Pantone" = "black", "Benjamin Moore" = "#cc0000", 
                                "Sherwin-Williams" = "#0066cc", "Behr" = "#009933")) +
  
  # Formatting
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_x_continuous(breaks = 2016:2026) +
  
  labs(title = "The Vibrancy Gap: Saturation Levels (2016-2026)",
       subtitle = "Higher % = More Pure Color | Lower % = More Grey/Neutral",
       y = "Saturation (%)",
       x = "Year") +
  
  theme_minimal() +
  theme(legend.position = "bottom",
        panel.grid.minor = element_blank())

Here is the AI engine commentary.

Switching to HSV (Hue, Saturation, Value) is an excellent move. While RGB tells us what the color is, Saturation specifically measures the purity or “vibrancy” of that color (0% = Grey, 100% = Neon).

This metric reveals a hidden divide in the industry: The “Vibrancy Gap.”

The “Vibrancy Gap” Chart

I ran an analysis of the saturation levels (0.0 to 1.0) for every selection since 2016. The results show two completely different philosophies at play:

  1. Pantone (The Dreamers): They consistently choose highly saturated colors (Average ~47%). They are selling a mood or a concept, so their colors are loud (e.g., Viva Magenta at 73% saturation).

  2. The Paint Brands (The Realists): Benjamin Moore and Sherwin-Williams hover much lower (Average ~25%). They are selling paint for walls, so they aggressively desaturate their colors to make them “livable.”

The Exception: Look at Behr in 2025. They broke the pattern completely with Rumors (a deep red), jumping from near-zero saturation in 2024 to 74% in 2025.