Colores y paletas de colores en R

Todo sobre la creación, personalización, modificación y uso de colores y paletas en R

7/7/2026

visualización de datos ggplot2

El uso del color es clave para comunicar, y el ecosistema de R tiene varios trucos convenientes para ayudarnos a usar el color de mejores formas.

En R, los colores se escriben como código, y a grandes rasgos pueden ser colores con nombre (por ejemplo, "purple"), colores hexadecimales (escritos como códigos de al menos 6 dígitos, como #FFFFFF), o como parte de funciones que producen paletas de colores.

Usar colores

La forma más básica de elegir un color en R es por su nombre. Por defecto, en R existen 657 colores con nombre.

Aquí puedes ver una lista de los principales colores de R y copiar sus nombres para usarlos:

white lightpink1 lightpink2 lightpink pink1 pink2 lightpink3 pink3 pink maroon palevioletred1 palevioletred2 palevioletred palevioletred3 lavenderblush lavenderblush2 lavenderblush3 deeppink deeppink2 violetred1 violetred2 deeppink3 hotpink violetred3 hotpink1 hotpink2 hotpink3 maroon1 maroon2 violetred mediumvioletred maroon3 magenta magenta2 magenta3 orchid1 darkmagenta orchid2 violet orchid orchid3 plum1 plum2 plum plum3 thistle1 thistle2 thistle thistle3 mediumorchid1 mediumorchid2 mediumorchid mediumorchid3 darkorchid1 purple darkorchid2 darkviolet darkorchid3 darkorchid purple1 purple2 blueviolet purple3 mediumpurple1 mediumpurple2 mediumpurple mediumpurple3 slateblue1 lightslateblue slateblue2 mediumslateblue slateblue3 slateblue darkslateblue blue blue2 blue3 navy midnightblue lavender ghostwhite royalblue1 royalblue2 royalblue royalblue3 cornflowerblue dodgerblue dodgerblue2 dodgerblue3 steelblue1 steelblue2 steelblue3 steelblue lightsteelblue1 lightsteelblue2 lightsteelblue lightsteelblue3 aliceblue deepskyblue deepskyblue2 deepskyblue3 skyblue1 lightskyblue skyblue2 skyblue3 skyblue lightskyblue1 lightskyblue2 lightskyblue3 lightblue1 lightblue2 lightblue lightblue3 cadetblue1 cadetblue2 cadetblue3 powderblue cyan turquoise1 cyan2 turquoise2 cyan3 darkturquoise turquoise3 mediumturquoise lightseagreen paleturquoise1 paleturquoise paleturquoise2 cadetblue paleturquoise3 lightcyan lightcyan2 lightcyan3 azure azure2 azure3 turquoise mediumspringgreen aquamarine aquamarine2 aquamarine3 springgreen springgreen2 springgreen3 seagreen1 seagreen2 seagreen3 mediumseagreen seagreen mintcream green green2 green3 limegreen forestgreen palegreen1 palegreen darkgreen lightgreen palegreen3 darkseagreen1 darkseagreen2 darkseagreen3 darkseagreen honeydew honeydew2 honeydew3 chartreuse lawngreen chartreuse2 chartreuse3 greenyellow darkolivegreen1 darkolivegreen2 darkolivegreen3 darkolivegreen olivedrab1 olivedrab2 olivedrab3 olivedrab yellow yellow2 yellow3 lightgoldenrodyellow lightyellow lightyellow2 beige lightyellow3 ivory ivory2 ivory3 darkkhaki khaki1 khaki2 khaki3 palegoldenrod khaki lemonchiffon lemonchiffon2 lemonchiffon3 gold gold2 gold3 lightgoldenrod lightgoldenrod1 lightgoldenrod2 lightgoldenrod3 cornsilk2 cornsilk3 cornsilk darkgoldenrod1 goldenrod1 darkgoldenrod2 goldenrod2 goldenrod darkgoldenrod3 goldenrod3 darkgoldenrod floralwhite orange orange2 orange3 wheat1 wheat wheat2 wheat3 oldlace moccasin papayawhip navajowhite navajowhite2 navajowhite3 blanchedalmond burlywood1 burlywood2 burlywood burlywood3 tan antiquewhite antiquewhite2 darkorange bisque bisque2 antiquewhite1 antiquewhite3 bisque3 darkorange1 darkorange2 darkorange3 peru linen tan1 tan2 sandybrown peachpuff peachpuff2 peachpuff3 seashell2 seashell3 chocolate1 chocolate2 chocolate chocolate3 seashell sienna1 sienna2 sienna3 sienna lightsalmon lightsalmon2 lightsalmon3 orangered orangered2 orangered3 coral darksalmon salmon1 salmon2 salmon3 coral1 coral2 coral3 tomato tomato2 tomato3 salmon mistyrose mistyrose2 mistyrose3 red red2 firebrick1 red3 firebrick2 brown1 brown2 firebrick3 brown3 firebrick darkred indianred1 indianred2 brown indianred3 indianred lightcoral rosybrown1 rosybrown2 rosybrown3 rosybrown snow snow2 snow3 gainsboro grey black

Ver un gráfico con todos los colores de R
Ver código para generar los cuadritos con colores que aparecen arriba
#| output: asis
# toma todos los colores con nombres desde `colors()` y los ordena por tono, intensidad y brillo, y genera html con todos los colores en pildoritas

colores <- colors(distinct = T) |> 
  stringr::str_subset("gray", negate = T) |> 
  stringr::str_subset("4", negate = T)

library(dplyr)

tabla_colores <- tibble(color = colores) |> 
  mutate(hex = gplots::col2hex(color)) |> 
  mutate(tono = shades::hue(color)) |> 
  mutate(brillo = shades::lightness(color)) |> 
  mutate(croma = shades::chroma(color)) |> 
  # mutate(contraste = colorspace::contrast_ratio(color, "black")) |> 
  mutate(across(where(is.numeric), ~round(.x, 0) |> signif(2))) |> 
  arrange(desc(tono), desc(croma), desc(brillo)) |>
  filter(!color %in% c("black", "white"))

colores <- tabla_colores$color

colores <- c("white", colores, "grey", "black")

estilo <- "color: black; border-radius: 4px; padding: 1px 4px; margin: 2px; line-height: 1.9;"

cuadritos <- purrr::map(
  colores,
  \(color) {
    shiny::span(
      color, 
      style = paste("background-color:", gplots::col2hex(color), ";",
                    estilo,
                    paste("color:", 
                          ifelse(
                            colorspace::contrast_ratio(color, "black") < 4, 
                            "white", "black"),
                          ";"),
                    paste("border: solid 1px", colorspace::darken(color, 0.3), ";")
      )
    )
  })

shiny::tagList(cuadritos)


Para usar colores en R, simplemente usa su nombre en las funciones donde se puedan usar colores:

colores <- c("indianred", "steelblue", "grey60")
indianred
steelblue
grey60

Casi todos estos colores pueden ser modificados agregando un número del 1 al 4 al final del nombre; por ejemplo, el color mediumorchid puede hacerse levemente más claro o más oscuro:

escala <- c("mediumorchid", "mediumorchid1", "mediumorchid2", "mediumorchid3", "mediumorchid4")
mediumorchid
mediumorchid1
mediumorchid2
mediumorchid3
mediumorchid4

Los grises (gray) tienen la particularidad de que puedes ponerles un número entre 1 y 99 para ajustar su brillo:

escala <- c("gray2", "gray10", "gray30", "gray50", "gray70", "gray90")
gray2
gray10
gray30
gray50
gray70
gray90

Si tienes colores hexadecimales, que puedes encontrar en internet en muchas páginas, como coolors.co, recuerda ponerlos entre comillas y anteponer el signo gato:

colores <- c("#DEC5F2", "#9069C0", "#6E3A98")
#DEC5F2
#9069C0
#6E3A98
Ver código para generar estos círculos con colores
paleta <- function(colores) {
  
  # colores <- colors(distinct = T) |> 
  #   stringr::str_subset("gray", negate = T)
  
  tamaño <- "width: 90px; height: 90px; font-size: 12px;"
  forma <- "border-radius: 50%; margin: 8px; display: inline-flex; word-break: break-all;"
  centrar <- "align-items: center; justify-content: center; text-align: center;"
  
  estilo <- paste(tamaño, forma, centrar)
  
  cuadritos <- purrr::map(
    colores,
    \(color) {
      shiny::div(
        color, 
        style = paste(
          paste("background-color:", gplots::col2hex(color), ";"),
          estilo,
          paste("color:", 
                ifelse(
                  colorspace::contrast_ratio(color, "black") < 4, 
                  "white", "black"), ";",
                paste("border: solid 1px", colorspace::darken(color, 0.2), ";")
          )
        ),
      )
    })
  
  
  output <- shiny::div(style = centrar,
                       shiny::tagList(cuadritos)
  ) 
  
  return(output)
}

# usar
paleta(c("#DEC5F2", "#9069C0", "#6E3A98"))

Paletas de colores

Varios paquetes de R contienen sus propias paletas de colores prediseñadas. Veremos algunas.

Uno de los conjuntos de paletas principales en visualización de datos, sobre todo para mapas, son las de Color Brewer, a las que puedes acceder con el paquete {RColorBrewer}.

Éstas son algunas de las paletas de Color Brewer:

library(RColorBrewer)
colores <- brewer.pal(name = "PuRd", n = 5)
#F1EEF6
#D7B5D8
#DF65B0
#DD1C77
#980043
colores <- brewer.pal(name = "BuPu", n = 5)
#EDF8FB
#B3CDE3
#8C96C6
#8856A7
#810F7C
colores <- brewer.pal(name = "Purples", n = 5)
#F2F0F7
#CBC9E2
#9E9AC8
#756BB1
#54278F
colores <- brewer.pal(name = "Blues", n = 5)
#EFF3FF
#BDD7E7
#6BAED6
#3182BD
#08519C
colores <- brewer.pal(name = "Set2", n = 5)
#66C2A5
#FC8D62
#8DA0CB
#E78AC3
#A6D854
colores <- brewer.pal(name = "Pastel1", n = 5)
#FBB4AE
#B3CDE3
#CCEBC5
#DECBE4
#FED9A6
colores <- brewer.pal(name = "PRGn", n = 5)
#7B3294
#C2A5CF
#F7F7F7
#A6DBA0
#008837
colores <- brewer.pal(name = "RdYlBu", n = 5)
#D7191C
#FDAE61
#FFFFBF
#ABD9E9
#2C7BB6

Puedes verlas todas ejecutando RColorBrewer::display.brewer.all()!

Ver todas las paletas de Color Brewer
RColorBrewer::display.brewer.all()

Cuando elijas una de las paletas, puedes usarla en cualquier gráfico de {ggplot2} con la función scale_color_brewer() o scale_fill_brewer(), según corresponda a la variable que quieres pintar, y elije la paleta por medio de su nombre:

library(ggplot2)

iris |> 
  ggplot() +
  aes(x = Sepal.Length, y = Sepal.Width, color = Species) +
  geom_point(size = 3, alpha = 0.8) +
  # usar la paleta "PuRd"
  scale_color_brewer(palette = "Set2")

Con el paquete {colorspace} también podemos ver otras paletas disponibles:

library(colorspace)

Aquí van algunas de ellas:

colores <- colorspace::sequential_hcl(5, palette = "Red-Blue")
#A93154
#BA4B8E
#BC6EB9
#B494D5
#AEB6E5
colores <- colorspace::sequential_hcl(5, palette = "Purple-Orange")
#5B3794
#9953A1
#C87AAD
#EBA8BA
#F8DCD9
colores <- colorspace::sequential_hcl(5, palette = "Heat 2")
#D33F6A
#E1704C
#E99A2C
#E8C33C
#E2E6BD
colores <- colorspace::sequential_hcl(5, palette = "BurgYl")
#772C4B
#A74F5A
#D6765D
#EDAA7D
#F8DFC1
colores <- colorspace::sequential_hcl(5, palette = "Mint")
#005D67
#1B817F
#64A79A
#9FCEBA
#E0F2E6
colores <- colorspace::sequential_hcl(5, palette = "PinkYl")
#E24C80
#EF7E71
#F6A972
#FAD18B
#FDF6B5
colores <- colorspace::sequential_hcl(5, palette = "Sunset")
#704D9E
#BC5AA9
#ED7C97
#F9B282
#F3E79A

Puedes ver todas las paletas de colores de {colorspace} ejecutando colorspace::hcl_palettes(plot = TRUE).

Ver todas las paletas de colores de {colorspace}
colorspace::hcl_palettes(plot = TRUE)

Usar estas paletas en {ggplot2} es tan fácil como agregar la función de escala apropiada para definir los colores del gráfico:

iris |> 
  ggplot() +
  aes(Petal.Width, Sepal.Width, color = Sepal.Length) +
  geom_point(size = 3, alpha = 0.7) +
  # usar la paleta "Sunset" para una variable continua
  colorspace::scale_color_continuous_sequential(palette = "Sunset") +
  scale_y_continuous(expand = expansion(c(0, 0.1)))

Encuentra una lista que compila todas las paletas de colores de la comunidad de R en este repositorio.

Usar paletas de colores en gráficos

Gráficos con colores manuales

La forma más simple de usar colores en gráficos de {ggplot2} es definiéndolos en la escala de color apropiada.

Para una variable discreta o categórica, los colores se aplican en la capa scale_color_manual() y se aplican en el orden de la variable:

library(ggplot2)

iris |> 
  ggplot() +
  aes(Sepal.Width, Sepal.Length, 
      color = Species) +
  geom_point(size = 2, alpha = .8) +
  scale_color_manual(
    values = c("#cc3b7b", "#705ce6", "#668cf6")
  )

O bien, se puede aplicar cada color a cada valor específico de la variable:

iris |> 
  ggplot() +
  aes(Sepal.Width, Sepal.Length, 
      color = Species) +
  geom_point(size = 2, alpha = .8) +
  # especificar un color para cada valor de la variable
  scale_color_manual(
    values = c("versicolor" = "#cc3b7b", 
               "virginica" = "#705ce6", 
               "setosa" = "#668cf6")
  )

Paletas de colores predefinidos

Muchos paquetes de R incorporan funciones de escalas de colores (scale_color_x(), scale_fill_x()) para aplicar una paleta de color fácilmente a un gráfico creado {ggplot2}.

Por ejemplo, las paletas de {colorspace} que vimos más arriba:

library(ggplot2)

# escalas para variables discretas
iris |> 
  ggplot() +
  aes(Petal.Width, fill = Species) +
  geom_bar() +
  colorspace::scale_fill_discrete_qualitative(palette = "Dark 3") +
  scale_y_continuous(expand = expansion(c(0, 0.1)))
# escalas para variables continuas
iris |> 
  ggplot() +
  aes(Sepal.Width, Sepal.Length, color = Petal.Width, size = Petal.Length) +
  geom_point(alpha = .8) +
  colorspace::scale_color_continuous_sequential(palette = "Sunset", na.value = "white") +
  scale_size_continuous(range = c(1, 3)) +
  guides(color = guide_colorsteps())
# escalas para variables continuas
iris |> 
  ggplot() +
  aes(Petal.Length, Sepal.Width, color = Petal.Width, size = Sepal.Length) +
  geom_point(alpha = .8) +
  viridis::scale_colour_viridis("viridis", na.value = "white") +
  scale_size_continuous(range = c(1, 3)) +
  guides(color = guide_colorsteps())

O bien, las paletas de {RColorBrewer} que vimos antes:

library(ggplot2)

iris |> 
  ggplot() +
  aes(x = Sepal.Length, y = Sepal.Width, color = Species) +
  geom_point(size = 3, alpha = 0.9) +
  # usar la paleta "Set2" de Color Brewer
  scale_color_brewer(palette = "Accent")

Algunas de las funciones para aplicar paletas de colores tienen funcionalidades extras. Por ejemplo, las funciones de {colorspace} permiten modificar sus paletas en términos de la saturación (chroma) y el brillo del color (luminance), entregándote más libertad al momento de definir una apariencia específica:

grafico <- iris |> 
  ggplot() +
  geom_point(aes(Sepal.Width, Sepal.Length, color = Petal.Width), size = 3, alpha = .8) +
  guides(color = guide_colorsteps())
grafico +
  colorspace::scale_color_continuous_sequential(
    palette = "TealGrn", 
    c1 = 50, # intensidad del color
    l1 = 40) # brillo del color
grafico +
  colorspace::scale_color_continuous_sequential(
    palette = "TealGrn", 
    c1 = 10, # intensidad del color
    l1 = 30) # brillo del color

Crear paletas de colores

También podemos usar funciones de R para crear paletas de colores personalizadas a partir de uno o varios colores, o especificando los rangos de variación de los colores.

Crear paletas secuenciales

Las paletas secuenciales consiste en un degradado entre dos o más colores. Suelen usarse para representar una variable continua o numérica, cuyo valor va cambiando de forma cuantitativa.

La función sequential_hcl() del paquete {colorspace} permite crear paletas secuenciales que, por defecto, se van degradando hacia blanco. El primer argumento es la cantidad de colores que deseas, y luego h es el tono desde el que quieres empezar la paleta:

colores <- colorspace::sequential_hcl(6, h = 300)
#850094
#9757A3
#B089B8
#C6B2CB
#D8D1DA
#E2E2E2

Ahora, una paleta de 6 colores, que empiece en el tono 300 y termine por el tono 100, a la vez que va aclarándose:

colores <- colorspace::sequential_hcl(8, h = c(300, 100))
#850094
#6858A9
#5585B1
#67A4B4
#90BCB9
#B8CEC4
#D5DBD6
#E2E2E2

Puedes explorar los argumentos para personalizar la paleta. Por ejemplo: 6 colores por el tono 200 definido en h, cambiando la intensidad del color en el argumento c, y pasando de una luminancia de 25 a una de 85

colores <- colorspace::sequential_hcl(5, 
                                      h = 200,
                                      c = c(45, 25), 
                                      l = c(25, 80)
)
#004B53
#00757B
#5A9DA2
#88BDC1
#A1CFD3

También se pueden obtener vectores de colores a partir de las paletas existentes que vienen con el paquete {colorspace}:

colores <- colorspace::sequential_hcl(5, palette = "Red-Blue")
#A93154
#BA4B8E
#BC6EB9
#B494D5
#AEB6E5
colores <- colorspace::sequential_hcl(5, palette = "Purple-Orange")
#5B3794
#9953A1
#C87AAD
#EBA8BA
#F8DCD9

Crear paletas cualitativas

Como su nombre ética, en las paletas cualitativas los colores van saltando para maximizar la diferencia entre ellos. Se utilizan para variables cualitativas, categóricas o discretas, donde cada elemento de una secuencia es independiente de los demás, y el objetivo del uso del color es poder distinguirlos.

La función rainbow_hcl() de {colorspace} entrega una típica paleta de arcoíris, pero con la posibilidad de modificar sus atributos de color en sus argumentos, tales como las tonalidades (hue) de inicio o final, la intensidad (chroma) de los tonos, y más.

Por ejemplo, una paleta de arcoíris de 6 colores con intensidad de color de 70:

colores <- colorspace::rainbow_hcl(6, c = 70)
#F68BA2
#D0A544
#76BD58
#00C5B3
#5EB3F0
#DB8FEA

Un arcoíris de 7 colores de croma 100, que empiece en la tonalidad 190 y termine en la 380:

colores <- colorspace::rainbow_hcl(6, 
                                   c = 100, 
                                   start = 190,
                                   end = 380)
#00CDC9
#00BFFF
#9F9EFF
#F67AFF
#FF72C3
#FF876E

Un arcoíris de 6 colores con intensidad de 60, luminancia de 30, que empiece en el tono 230 y termine en el 370:

colores <- colorspace::rainbow_hcl(6, 
                                   c = 60, 
                                   l = 30, 
                                   start = 230, 
                                   end = 370)
#00537E
#21438B
#642C87
#7D1674
#841956
#7E292E

También pueden usarse los nombres de las paletas preexistentes para generar una secuencia cualitativa con ellos.

Por ejemplo, 6 colores de la paleta de colores fríos, con intensidad (chroma) de 80:

colores <- colorspace::qualitative_hcl(6, 
                                       palette = "Cold", 
                                       c = 80)
#AC9FFF
#62B0FD
#00BEEB
#00C6CF
#00C8AB
#00C681

Seis colores de la paleta de colores cálidos, con intensidad (chroma) de 70:

colores <- colorspace::qualitative_hcl(6, 
                                       palette = "Warm", 
                                       c = 70)
#ABB234
#C9A83D
#E19D60
#F09286
#F78AAB
#F387CC

Crear paletas divergentes

Las paletas divergentes se utilizan cuando una variable expresa dos polos; una una misma magnitud donde los extremos son separados por una brecha central.

colores <- colorspace::diverging_hcl(n = 5, 
                                     h = c(35, 200),
                                     l = c(50, 90))
#B2630F
#D7B4A4
#E2E2E2
#8FC4C9
#00919D
colores <- colorspace::diverging_hcl(n = 6, h = c(320, 180))
#92007C
#BB86AE
#DBD0D8
#C9D6D4
#4EA49A
#006250
colores <- colorspace::diverging_hcl(n = 6, 
                                     h = c(360, 180), 
                                     c = 30,
                                     l = 60)
#B4848D
#A28B8F
#948F90
#8D9291
#7B9692
#5B9C94

Como podemos ver, todas las paletas divergentes pasan por un tono blanco en el intermedio.

Extender paletas de colores

Si tienes un vector de colores y necesitas alargarlo para tener más colores basados en la paleta original, puedes hacerlo con la función colorRampPalette(). Esta función crea otra función a partir de los colores, a la que luego le das el número de colores que necesites obtener a partir de la paleta original:

# paleta de 5 colores
colores <- c("#f4b43f", "#ec6a2d", "#cc3b7b", "#705ce6", "#668cf6")
#f4b43f
#ec6a2d
#cc3b7b
#705ce6
#668cf6
# extender la paleta de 5 colores a 12 colores
colores <- colorRampPalette(colores)(12)
#F4B43F
#F19938
#EE7E31
#E96534
#DD5450
#D1436C
#BB418E
#994DB5
#7859DC
#6D69EA
#697AF0
#668CF6

También podemos usar esta función para crear con facilidad una paleta secuencial entre dos o más colores:

colores <- c("#df65b2", "#fae55f")
#df65b2
#fae55f
# extender la paleta a 8 colores
colores <- colorRampPalette(colores)(16)
#DF65B2
#E06DAC
#E276A6
#E47EA1
#E6879B
#E88F96
#E99890
#EBA08B
#EDA985
#EFB180
#F1BA7A
#F2C275
#F4CB6F
#F6D36A
#F8DC64
#FAE55F

Usando las paletas de colores creadas

Una vez que pensaste una paleta de colores, puedes usarla en cualquier gráfico de {ggplot2} usando scale_color_manual() o scale_fill_manual(), según corresponda, teniendo en consideración que tienes que crear la cantidad de colores que necesites según tus datos.

En este ejemplo, usamos la paleta de colores fríos para un gráfico de dispersión de la base de datos msleep que viene con {ggplot2}:

library(ggplot2)
library(dplyr)

# preparar datos de prueba
datos <- msleep |> 
  filter_out(is.na(vore))

# ver cuántos valores únicos tiene la variable
n_casos <- n_distinct(datos$vore)

# crear una paleta con esa cantidad de colores
colores <- colorspace::qualitative_hcl(n_casos, 
                                       palette = "Cold", 
                                       c = 80)

# visualizar
datos |> 
  ggplot() +
  aes(x = vore, y = sleep_total, color = vore) +
  geom_jitter(size = 3, alpha = 0.7, width = 0.3) +
  scale_color_manual(values = colores)

Personalizar y crear colores

Modificar colores existentes

Las funciones del paquete {shades} nos permitan obtener información detallada sobre cada uno de los colores, y usar esta misma información para modificarlos con mucho detalle.

Por ejemplo, definamos un color, y luego obtengamos el valor de su tonalidad. Recordemos que la tonalidad de los colores se expresan como grados entre 0° y 360°.

color <- "#f65b74"
#f65b74
shades::hue(color)
[1] 350.3226

Obtenemos que, para el color definido, el valor de su tonalidad es 350.3226125. Podemos usar esta información para modificar levemente el mismo color y así obtener una variable del mismo color levemente más anaranjada.

color2 <- shades::hue(color, 370)
#f65b74
#F6755B

Podemos obtener mismos resultados utilizando el delta de la tonalidad del color; es decir, sumándole restándole una cantidad de grados a el valor de la tonalidad del color mismo:

color3 <- shades::hue(color, delta(50))
#f65b74
#F6C35B

Al usar la función delta(), lo que hacemos es pedirle que cambie la tonalidad del color en 50°, volviéndose en un tono amarillo.

Podemos obtener un resultado similar usando col_shift() del paquete {scales}:

color2 <- scales::col_shift(color, 20)
#f65b74
#E86D2BFF

El brillo (brightness) va de cero a uno, mientras que la claridad (lightness) va de cero a 100.

color <- color |> brightness(0.7)
#B34254
color <- color |> lightness(delta(20))
#EE7786

Con {scales}, la función col_lighter() realiza el mismo propósito:

color <- col_lighter(color, 20)
#F9D2D7

Por su parte, la saturación aumenta la intensidad del color.

color <- color |> saturation(delta(30))
#F90020

Podemos utilizar la función delta() para crear una sencilla paleta de colores a partir de un mismo color, aumentando y disminuyendo su intensidad (chroma):

colores <- c(color |> chroma(delta(30)), 
             color,
             color |> chroma(delta(-30)))
#FF0000
#F90020
#D94C3E

En {scales}, la función es col_saturate():

color <- col_saturate(color, -50)
#BB3E4E

Podemos combinar estas técnicas para crear una paleta de colores más compleja, construida toda a partir de un solo color al cual se le va aumentando o disminuyendo sus valores de claridad e intensidad. El beneficio de hacerlo de esta manera es que luego basta con cambiar el color principal para obtener una paleta de iguales características, pero basada en una tonalidad distinta.

color_principal = "#4D4484"

color_fondo = color_principal |> lightness(13) |> chroma(20)
color_detalle = color_principal |> lightness(20) |> chroma(40)
color_destacado = color_principal |> lightness(50) |> chroma(65)
color_texto = color_principal |> lightness(80)

colores <- c(color_principal,
             color_fondo,
             color_detalle,
             color_destacado,
             color_texto)
#4D4484
#221E39
#2D2863
#7467D7
#CCBCFF

Ahora usamos el mismo código, pero cambiando el color de origen:

color_principal = "#3170ac"

color_fondo = color_principal |> lightness(13) |> chroma(20)
color_detalle = color_principal |> lightness(20) |> chroma(40)
color_destacado = color_principal |> lightness(50) |> chroma(65)
color_texto = color_principal |> lightness(80)

colores <- c(color_principal,
             color_fondo,
             color_detalle,
             color_destacado,
             color_texto)
#3170ac
#03233D
#00346C
#007EE6
#96CAFF

Notar que el código es igual, y sólo se cambió el valor del color_principal. Esta estrategia es muy útil si se están produciendo visualizaciones o aplicaciones que ocupan una paleta de colores monocromática.

Mezclar colores

Las funciones submix() y addmix() del paquete {shades} facilitan el mezclado de colores sustraje ctivo y aditivo, respectivamente.

A partir de dos colores, entrega la mezcla de ellos, abriendo muchas posibilidades para la experimentación y creación de nuevos colores.

Los siguientes ejemplos muestran en el centro la mezcla que resulta de los otros dos colores:

colores <- c("#70f1d5",
             submix("#70f1d5", "#fae55f"),
             "#fae55f")
#70f1d5
#6BD735
#fae55f
colores <- c("#3377f7",
             addmix("#3377f7", "#ec4e3c"),
             "#ec4e3c")
#3377f7
#FFC5FF
#ec4e3c
colores <- c("#f9ce45",
             submix("#f9ce45", "#77d671", amount = 0.5),
             "#77d671")
#f9ce45
#B5BA00
#77d671

Aplicar una tonalidad a una paleta de colores

El paquete {scales} también provee una función para mezclar colores: col_mix(). Cualquiera de estas funciones, ya sea scales:col_mix() o shades::addmix() y shades::submix() pueden usarse para tomar una paleta de colores y volverla más coherente al aplicarle una pequeña fracción de otro color. Veamos primero la paleta:

#77d671
#70f1d5
#fae55f
#ff479c

Ahora agreguémosle un 20% de naranjo a todos sus colores:

colores <- col_mix(a = c("#77d671", "#70f1d5", "#fae55f", "#ff479c"),
                   b = "orange2", 
                   amount = 0.2)

Ahora vemos que la paleta mantiene la diferencia entre sus colores, pero ahora todos se perciben más coherentes al compartir una tonalidad común:

#8FCA5A
#89E0AA
#F8D64C
#FC587D

Crear colores

Puedes crear un color en R definiendo su tonalidad (hue), saturación (saturation) y brillo (value) con hsv(), entendiendo que el matiz es la posición del color en la escala de todos los colores, que va del 0 al 1, empezando y terminando con el rojo:

color <- hsv(h = 0, s = 1, v = 1)
#FF0000

Para guiarse, la siguiente gráfica muestra la tonalidad de colores entre 0 y 1,

Ver código de la secuencia de colores y el gráfico
library(purrr)
library(dplyr)
library(ggplot2)

secuencia <- seq(0.0, 1.0, 0.1)

colores <- map(secuencia,
~hsv(h = .x, s = 1, v = 1))

tabla <- tibble(secuencia,
colores = unlist(colores))

tabla |> 
ggplot() +
aes(x = secuencia, y = 1,
fill = colores) +
geom_tile(color = "#EAD1FA") +
scale_fill_identity() +
scale_x_continuous(breaks = secuencia) +
theme_void(
paper = "#EAD1FA",
accent = "#9069C0",
ink = "#553A74") +
theme(axis.text.x = element_text(margin = margin(t = 1, b = 6)))

Siguiendo el gráfico anterior, vemos que el tono 0.8 corresponde al color morado, así que podemos crearlo con hsv():

color <- hsv(0.85, 1, 1)
#FF00E6

Luego podemos modificar la saturación y brillo del color con los otros dos argumentos de hsv():

color <- hsv(0.82, 0.5, 0.4)
#623366

Previsualizar colores

En R puedes usar la función swatch() del paquete {shades} para previsualizar cualquier color o vector de colores. Una alternativa es la función show_col() de {scales}, que hace lo mismo.

library(shades)
library(scales)
colores <- c("#DEC5F2", "#9069C0", "#6E3A98")

shades::swatch(colores)
scales::show_col(colores)

Así puedes experimentar visualizando de inmediato las mezclas de colores y paletas de colores que crees.

Avanzado

Analizar colores

Si tenemos un conjunto de colores, podemos analizar sus propiedades, como tono (hue), brillo, e intensidad del color (chroma).

colores <- colors()
library(dplyr)

# crear una tabla con el vector de colores
tabla <- tibble(color = colores)

Con las funciones hue(), lightness() y chroma() del paquete {shades} podemos calcular el tono, brillo e intensidad de cada color:

library(shades)

tabla <- tabla |> 
  mutate(tono = shades::hue(color)) |> 
  mutate(brillo = shades::lightness(color)) |> 
  mutate(croma = shades::chroma(color)) |> 
  # redondear los valores
  mutate(across(where(is.numeric), ~round(.x, 0))) |> 
  # ordenar los colores
  arrange(desc(tono), desc(croma), desc(brillo))

Así obtenemos una tabla con las características de los colores, con lo que podemos ordenarlos por tono, desde menos a más claros, o realizar otras operaciones.

tabla
# A tibble: 657 × 4
   color       tono brillo croma
   <chr>      <dbl>  <dbl> <dbl>
 1 lightpink1   352     79    32
 2 lightpink3   352     65    27
 3 lightpink4   352     45    19
 4 lightpink2   351     74    30
 5 lightpink    351     81    29
 6 pink         350     84    24
 7 pink1        347     81    29
 8 pink2        347     76    28
 9 pink3        347     66    25
10 pink4        347     46    18
# ℹ 647 more rows

También podemos visualizar esta información con la función specplot() de {colorspace}:

colores <- colorspace::sequential_hcl(5, h = 290, c = 70)

colorspace::specplot(colores)

En el gráfico anterior vemos que los colores de la paleta no cambian de tono (hue), pero sí aumentan en brillo (luminance) y bajan en intensidad (chroma). Usualmente se recomienda que las paletas tengan también un cambio de tono, lo que ayuda con la accesibilidad. Así que podemos hacer un cambio en la paleta para mejorarla un poco, indicando que queretmos que el tono (argumento h) cambie:

colores <- colorspace::sequential_hcl(5, h = c(290, 350), c = 70)
#701B91
#9D67A0
#C19EB8
#D8CAD1
#E2E2E2

Analizar el contraste de colores

Para mejorar la visibilidad y accesibilidad de tus visualizaciones de datos, puedes calcular el valor de contraste que tienen tus colores en comparación con otro. Por ejemplo, medir el contraste que tendría un texto negro encima de los colores de tu paleta:

# paleta de morados de distinta intensidad
colores <- colorspace::sequential_hcl(5, h = 290, c = 70)
colorspace::contrast_ratio(colores, "black", plot = TRUE)
colorspace::contrast_ratio(colores, "white", plot = TRUE)

La función contrast_ratio() del paquete {colorspace} retorna números que representan el contraste, donde un valor menor significa menor contraste, y por lo tanto menor visibilidad del color en comparación con el color de referencia.

Esto mismo se puede hacer con páginas como WebAIM, pero la gracia de hacerlo con R es que podemos usar la información del contraste para tomar decisiones: por ejemplo, decidir automáticamente si un texto debe ser blanco o negro dependiendo del color que le corresponde:

library(dplyr)
library(ggplot2)
library(colorspace)

# paleta de morados de distinta intensidad
colores <- colorspace::sequential_hcl(5, h = 290, c = 70)

# poner colores en tabla
tabla <- tibble(colores = colores,
                secuencia = seq_along(colores)) |> 
  # calcular contraste de cada color respecto al color negro
  mutate(contraste = contrast_ratio(colores, "black"))

# gráfico simple para mostrar los colores
tabla |> 
  ggplot() +
  # gráfico de mosaicos
  aes(x = secuencia, y = 1,
      fill = colores) +
  geom_tile(color = "#EAD1FA") +
  # texto con nombre de colores
  geom_text(
    aes(label = colores),
    # definir color del texto según el contraste
    color = ifelse(tabla$contraste > 7, "black", "white")
    ) +
  # aplicar el color que viene en la columna usada para el `fill`
  scale_fill_identity() +
  theme_void(
    base_family = "Atkinson Hyperlegible",
    paper = "#EAD1FA",
    accent = "#9069C0",
    ink = "#553A74")

Ahora el color del texto se decide dependiendo del contraste del color de fondo!

Convertir colores a código hecadecimal

Si tenemos colores definidos como nombres, podemos convertirlos a su valor hexadecimal con la función col2hex() del paquete {gplots}:

color <- "mediumpurple"

gplots::col2hex(color)
[1] "#9370DB"

Visualizar paletas en espacios de color

{colorspace} incluye funciones para poder visualizar secuencias de colores en proyecciones del espacio de color HCL (hue, chroma, luminance), lo que nos permite contextualizar las paletas en un espacio perceptual del color basado en estos tres parámetros.

colores <- sequential_hcl(7, h = 280, c = 80, l = c(35, 95))

colorspace::hclplot(colores)
colores <- sequential_hcl(7, h = c(280, 220), c = c(50, 70, 20), l = c(30, 90), power = 1.1)

colorspace::hclplot(colores)

Fuentes y recursos

Fecha de publicación:
July 7, 2026
Extensión:
21 minute read, 4382 words
Tags:
visualización de datos ggplot2
Ver también:
Crea mapas bivariados en R para visualizar la relación entre dos variables
Palíndromos de Chile
Mapas hexagonales o cuadriculados con R