Color y accesibilidad: paletas que funcionan
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:
- 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.
- Accesible para daltonismo: distinguible para la mayoría de tipos.
- 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_*: paraaes(color = ...). Aplica a puntos, líneas, bordes.scale_fill_*: paraaes(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 usafacet_wrapen 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
shapeolinetypepara 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.