Color y Estilos Visuales
El sistema de color en Observable Plot
El color y los estilos visuales son herramientas fundamentales en la visualización de datos. No solo hacen que un gráfico sea más atractivo, sino que también pueden comunicar información adicional, dirigir la atención y mejorar la legibilidad.
En esta lección aprenderemos a controlar:
- Color de relleno de las formas
- Color y grosor de los bordes
- Opacidad (transparencia)
- Diferentes formatos para especificar colores
Gráfico base
Comenzaremos con un gráfico de dispersión de la lección anterior que muestra la relación entre la mortalidad infantil y la expectativa de vida:
Ver código Plot.plot gráfico base
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy"
})
]
})
Este gráfico funciona, pero es demasiado básico y no muestra de manera sencilla lo que se quiere dar a entender. Vamos a mejorarlo paso a paso agregando propiedades de color y estilo.
Agregando color de relleno: fill
La propiedad fill controla el color interior de las formas (puntos, barras, áreas, etc.). Observable Plot acepta múltiples formas de definir colores:
1. Nombres de colores CSS
Existen más de 140 nombres de colores predefinidos en CSS, entre los que se encuentran "steelblue", "coral", "forestgreen", "crimson", "gold", "orchid", "teal", "salmon", "slateblue", ...
Ver código Plot.plot con fill nombre CSS
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue"
})
]
})
¿Qué cambió?
Se agregó la línea:
- fill: "steelblue": define el color de relleno de todos los puntos
Ahora los puntos tienen color azul acero en lugar del negro predeterminado.
Cuándo usar nombres CSS:
- Prototipos rápidos
- Colores estándar reconocibles
- Cuando no se requieren colores de marca específicos
2. Códigos hexadecimales
El formato hexadecimal permite especificar cualquier color usando el formato #RRGGBB.
Ver código Plot.plot con fill hexadecimal
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "#4682b4" // steelblue en hexadecimal
})
]
})
Estructura del código hex:
#seguido de 6 caracteres hexadecimales (0-9, A-F)- Primeros 2 caracteres: componente rojo (Red)
- Caracteres 3-4: componente verde (Green)
- Caracteres 5-6: componente azul (Blue)
Ejemplos:
- #FF0000 = rojo puro
- #00FF00 = verde puro
- #0000FF = azul puro
- #000000 = negro
- #FFFFFF = blanco
Cuándo usar hex:
- Colores exactos de una paleta de marca
- Cuando se necesita precisión en el color
- Para mantener consistencia con diseños web
3. RGB y RGBA
El formato RGB especifica colores usando valores numéricos para rojo, verde y azul (0-255).
Ver código Plot.plot con fill RGB
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "rgb(70, 130, 180)" // steelblue en RGB
})
]
})
RGBA agrega un cuarto valor para la opacidad (0-1):
Ver código Plot.plot con fill RGBA
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "rgba(70, 130, 180, 0.6)" // 60% opaco
})
]
})
Cuándo usar RGB/RGBA:
- Cuando se trabaja con valores numéricos de color
- Para aplicar transparencia directamente en la definición del color
- En generación programática de colores
Controlando la opacidad: fillOpacity
La propiedad fillOpacity controla la transparencia del relleno de forma independiente al color.
Ver código Plot.plot con fillOpacity
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue",
fillOpacity: 0.6
})
]
})
Valores:
0= completamente transparente (invisible)0.5= semi-transparente1= completamente opaco (valor predeterminado)
¿Por qué usar opacidad?
La opacidad es especialmente útil cuando:
- Hay puntos superpuestos: permite ver puntos que están detrás de otros
- Se quiere mostrar densidad: áreas con más superposición se ven más oscuras
- Se busca un estilo visual más suave: hace que el gráfico se vea menos "pesado"
- Se necesita destacar ciertos elementos: combinando opacidades diferentes
Agregando bordes: stroke
La propiedad stroke define el color del borde (contorno) de las formas.
Ver código Plot.plot con stroke
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue",
fillOpacity: 0.6,
stroke: "darkblue"
})
]
})
¿Qué cambió?
Se agregó:
- stroke: "darkblue": define un borde azul oscuro alrededor de cada punto
Los bordes ayudan a definir mejor los límites de cada forma, especialmente cuando hay superposición y se pueden usar los diferentes formatos para aplicar colores.
Controlando el grosor del borde: strokeWidth
La propiedad strokeWidth define el grosor del borde en píxeles.
Ver código Plot.plot con strokeWidth
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue",
fillOpacity: 0.6,
stroke: "darkblue",
strokeWidth: 2
})
]
})
Guía de grosores
0: sin borde (equivalente astroke: "none")0.5 - 1: borde sutil, profesional (recomendado para la mayoría de casos)1.5 - 2: borde visible, para énfasis moderado2.5 - 3: borde grueso, para destacar3+: muy grueso, uso específico para elementos importantes
Opacidad del borde: strokeOpacity
Al igual que el relleno, los bordes también pueden tener opacidad controlada.
Ver código Plot.plot con strokeOpacity
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue",
fillOpacity: 0.6,
stroke: "darkblue",
strokeWidth: 2,
strokeOpacity: 0.3
})
]
})
Uso común:
- Crear efectos de sombra sutiles
- Reducir la prominencia de bordes sin eliminarlos
- Combinar con rellenos semi-transparentes para efectos visuales complejos
Estilos de gráficos útiles
A continuación se presentan algunas combinaciones de estilos que funcionan bien en diferentes contextos:
Estilo 1: Minimalista
Sin bordes, color sólido, alta opacidad.
Ver código Plot.plot estilo minimalista
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "#3b82f6",
fillOpacity: 0.9,
stroke: "none"
})
]
})
Cuándo usar:
- Gráficos limpios y modernos
- Cuando no hay superposición significativa
- Para presentaciones profesionales
Estilo 2: Alta visibilidad
Borde oscuro contrastante, relleno semi-transparente.
Ver código Plot.plot estilo alta visibilidad
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "steelblue",
fillOpacity: 0.6,
stroke: "#1e3a8a",
strokeWidth: 1.5
})
]
})
Cuándo usar:
- Cuando hay muchos puntos superpuestos
- Para mejorar la definición de cada elemento
- En gráficos con fondos complejos
Estilo 3: Transparente con borde prominente
Relleno muy transparente, borde visible.
Ver código Plot.plot estilo transparente con borde
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "coral",
fillOpacity: 0.3,
stroke: "coral",
strokeWidth: 2,
strokeOpacity: 0.9
})
]
})
Cuándo usar:
- Para enfatizar bordes y formas
- Cuando se quiere ver claramente la superposición
- En visualizaciones exploratorias
Estilo 4: Sin relleno (solo contorno)
Solo borde, sin relleno interior.
Ver código Plot.plot estilo solo contorno
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "none",
stroke: "forestgreen",
strokeWidth: 2
})
]
})
Cuándo usar:
- Para un look minimalista y elegante
- Cuando se combinan múltiples capas de datos
- Para reducir la "carga visual" del gráfico
Aplicando a otros tipos de gráficos
Las propiedades de color y estilo funcionan de manera similar en todos los tipos de marcas. Veamos ejemplos:
Histograma con estilos
Ver código Plot.plot histograma con estilos
Plot.plot({
marks: [
Plot.rectY(datos, Plot.binX({y: "count"}, {
x: "life_expectancy",
fill: "coral",
fillOpacity: 0.7,
stroke: "white",
strokeWidth: 2
}))
]
})
Barras horizontales con estilos
Ver código Plot.plot barras con estilos
Plot.plot({
marks: [
Plot.barX(
datos.slice(10, 20),
{
y: "country",
x: "life_expectancy",
fill: "forestgreen",
fillOpacity: 0.8,
stroke: "darkgreen",
strokeWidth: 1
}
)
]
})
Área con estilos
Ver código Plot.plot área con estilos
Plot.plot({
marks: [
Plot.areaY(datos, Plot.binX({y: "count"}, {
x: "life_expectancy",
curve: "basis",
fill: "mediumpurple",
fillOpacity: 0.5,
stroke: "purple",
strokeWidth: 2
}))
]
})
Mejores prácticas y accesibilidad
Contraste adecuado
Buenas prácticas: (Web Accessibility Initiative, 2018), (Nam Wook, 2021)
- Usar suficiente contraste entre el color y el fondo
- Probar el gráfico en escala de grises
- Asegurar que la información no dependa solo del color
Evitar:
- Combinaciones de bajo contraste (gris claro sobre blanco)
- Depender únicamente del color para transmitir información crítica
Saturación y fatiga visual
Buenas prácticas: (Few, 2012)
- Usar colores de saturación media para visualizaciones extensas
- Reservar colores muy saturados para destacar elementos específicos
- Usar opacidad moderada (0.6-0.8) para reducir el peso visual
Evitar:
- Colores neón o muy saturados en grandes áreas
- Demasiados colores diferentes (máximo 5-7 en un gráfico)
- Opacidad muy baja (<0.3) para información importante
Resumen de propiedades
| Propiedad | Tipo | Valores | Función |
|---|---|---|---|
| fill | Color | Nombre, hex, rgb(a) | Color del relleno interior |
| fillOpacity | Número | 0 (transparente) a 1 (opaco) | Transparencia del relleno |
| stroke | Color | Nombre, hex, rgb(a), "none" | Color del borde |
| strokeWidth | Número | 0+ píxeles | Grosor del borde |
| strokeOpacity | Número | 0 (transparente) a 1 (opaco) | Transparencia del borde |
Conclusiones de la lección
En esta lección se ha explorado el sistema completo de color y estilos visuales en Observable Plot, partiendo de un gráfico básico y agregando propiedades progresivamente.
Conceptos clave
Propiedades de color
- fill controla el color interior de las formas
- stroke controla el color de los bordes
- Ambas aceptan nombres CSS, códigos hex y valores RGB/RGBA
Propiedades de opacidad
- fillOpacity y strokeOpacity controlan la transparencia
- Valores de 0 (invisible) a 1 (opaco)
- Útiles para manejar superposición y reducir peso visual
Grosor de borde
- strokeWidth define el grosor en píxeles
- Valores de 0.5-2 son los más comunes
- Usar
0o"none"para eliminar bordes
Reflexión final
El color y los estilos no son solo decorativos: son herramientas de comunicación visual. La elección adecuada de colores, opacidades y bordes puede:
- Mejorar la legibilidad del gráfico
- Dirigir la atención hacia elementos importantes
- Revelar patrones que serían invisibles de otra forma
- Hacer accesible la información para todas las audiencias
La clave está en encontrar el equilibrio entre estética y funcionalidad, siempre priorizando la claridad del mensaje.
Próximo paso: En la Configuración de Ejes se explorará la configuración de ejes, aprendiendo a personalizar etiquetas, cuadrículas, rangos y formatos para crear visualizaciones profesionales y fáciles de interpretar.