Color y accesibilidad: paletas que funcionan

r
visualizacion
ggplot2
Por qué el color importa más de lo que parece. Discretas vs continuas, viridis y por qué, simular daltonismo con colorspace y construir paletas de marca accesibles.

Por qué el color importa más de lo que parece

El color es el aesthetic con mayor “trampa al ojo”. Una paleta mal elegida puede:

  • Sugerir un orden donde no lo hay (un arcoíris para variables nominales).
  • Hacer ilegible el gráfico para el 8 % de los hombres (daltonismo rojo-verde).
  • Cansar la vista (saturaciones excesivas) o desaparecer (colores demasiado claros sobre fondo blanco).
  • Imprimir mal en blanco y negro.

Una paleta bien elegida hace lo opuesto: dirige la atención, comunica jerarquía, sobrevive a la fotocopia.

Antes de aprender qué paleta usar, hay una distinción conceptual.

Discretas vs continuas: dos problemas distintos

Tus datos son uno de dos tipos:

  • Discretas: categorías sin orden natural (species, region, tipo). Necesitas colores distinguibles entre sí, sin sugerir gradiente.
  • Continuas / ordinales: números o categorías ordenadas (temperatura, año, nivel). Necesitas un gradiente que comunique la secuencia.

En ggplot2 son scales distintas:

# Discreta — colores categóricos
scale_color_discrete()    # default
scale_color_brewer(palette = "Set2")
scale_color_viridis_d()

# Continua — gradiente
scale_color_continuous()  # default azul claro → oscuro
scale_color_gradient(low = "white", high = "steelblue")
scale_color_viridis_c()

Confundirlas es el error número uno: aplicar paleta categórica a una variable continua (te quedas con 8 saltos discretos) o paleta continua a una categórica (los grupos no se distinguen entre sí).

Viridis y por qué

viridis es la paleta continua que viene siendo el default recomendado de la comunidad desde 2016. Tres propiedades:

  1. Percepcionalmente uniforme: la diferencia visual entre dos colores adyacentes es siempre la misma. Si dos puntos parecen igual de distintos, sus valores también lo son.
  2. Accesible para daltonismo: distinguible para la mayoría de tipos.
  3. Imprime bien en blanco y negro: el gradiente preserva la jerarquía cuando se desatura.
library(ggplot2)
library(palmerpenguins)

# Continua
ggplot(diamonds, aes(carat, price, color = depth)) +
  geom_point(alpha = 0.3) +
  scale_color_viridis_c()

# Discreta — usa una versión muestreada de la misma paleta
ggplot(penguins, aes(bill_length_mm, flipper_length_mm, color = species)) +
  geom_point() +
  scale_color_viridis_d()

Variantes: option = "magma", "plasma", "inferno", "cividis" (esta última optimizada explícitamente para daltonismo).

Daltonismo: tres tipos, tres tests

Daltonismo no es una cosa única. Las tres formas principales:

  • Deuteranopía: confusión rojo/verde. La más común (~5 % de los hombres).
  • Protanopía: similar al rojo/verde pero con sensibilidad reducida al rojo.
  • Tritanopía: confusión azul/amarillo. Muy rara.

Para testar tu gráfico, el paquete colorspace permite simular cada tipo:

install.packages("colorspace")
library(colorspace)

# Crear el gráfico normalmente
p <- ggplot(penguins, aes(bill_length_mm, flipper_length_mm, color = species)) +
  geom_point() +
  scale_color_brewer(palette = "Set1")

# Simular cómo lo ve alguien con cada tipo de daltonismo
deutan(p)
protan(p)
tritan(p)

Si los grupos siguen siendo distinguibles bajo los tres filtros, tu gráfico es accesible. Si algún par de grupos se vuelve indistinguible, considera otra paleta.

Regla práctica: para gráficos categóricos importantes, usa scale_color_viridis_d() (segura) o testa explícitamente con deutan(). Evita las paletas R por defecto en gráficos importantes (rojo + verde adyacentes son trampa clásica).

Paletas con marca propia

Cuando construyes identidad visual (theme propio, colores corporativos), creas tu paleta:

# Paleta jade-marfil-carbón (estilo Rmori)
paleta_rmori <- c(
  "#5F8575",   # jade
  "#3F6354",   # jade-dark
  "#C28840",   # ocre warm
  "#6B6B6B",   # neutral
  "#2A2A2A"    # carbón
)

# Función helper para usar en ggplot
scale_color_rmori <- function(...) {
  scale_color_manual(values = paleta_rmori, ...)
}

# Uso
ggplot(penguins, aes(bill_length_mm, flipper_length_mm, color = species)) +
  geom_point() +
  scale_color_rmori()

Antes de cerrar la paleta, testala con colorspace::deutan(). Si pasa, está lista para el theme.

Para paletas continuas con dos colores de marca, usa scale_color_gradient:

scale_color_gradient(low = "#FAF9F6", high = "#3F6354")

O con tres (divergente, para datos centrados en un valor): scale_color_gradient2(low, mid, high, midpoint).

fill vs color

Recordatorio del tutorial de aes(): color es el trazo, fill es el relleno. Todas las scales tienen ambas variantes:

  • scale_color_*: para aes(color = ...). Aplica a puntos, líneas, bordes.
  • scale_fill_*: para aes(fill = ...). Aplica a barras, áreas, polígonos.

Confundirlos genera leyendas duplicadas (una por color, otra por fill para el mismo grupo). Sé consciente de qué aesthetic estás mapeando y aplica la scale correspondiente.

Trampas habituales

  • Paletas arcoíris para variables continuas. El cerebro humano no ve el arcoíris como un gradiente, ve “azul lejos, rojo cerca” pero el medio (verde, amarillo) se interpreta de forma no lineal. Para continuas: viridis o equivalentes percepcionalmente uniformes.
  • Demasiados colores categóricos. Más de 7-8 categorías distinguibles a la vez es prácticamente imposible. Si tienes más, agrupa el resto en "Otros" o usa facet_wrap en vez de color.
  • No testar daltonismo. El 8 % de los hombres y el 0.5 % de las mujeres tienen alguna forma. Un gráfico para 100 personas es estadísticamente seguro que será leído por alguien con visión de color reducida. Es un coste de 30 segundos con deutan().
  • Color como única señal cuando hay impresión B/N. Si tu gráfico va a una revista que aún imprime en blanco y negro, usa también shape o linetype para diferenciar, el color desaparece en B/N pero la forma se mantiene.

En la siguiente entrega

Has aprendido a elegir color con criterio. Es la última pieza pedagógica de la ruta. El caso completo que viene a continuación junta los 10 tutoriales anteriores en un análisis publicado de principio a fin, continuación natural del análisis NYC flights de la Ruta 1.