Introducción a Observable Plot
¿Qué es Observable Plot?
Observable Plot es una biblioteca de JavaScript diseñada para crear visualizaciones de datos de forma declarativa (Observable, Inc., 2024). Este enfoque permite describir qué se desea visualizar, mientras que la biblioteca se encarga de los detalles técnicos relacionados con cómo se realiza la visualización.
Ventajas:
- Código simple y legible
- Menor cantidad de líneas en comparación con otras bibliotecas
- Diseño automático de ejes y escalas
- Integración nativa con Observable Framework
Estructura básica:
Todo gráfico en Observable Plot se construye a partir de la función:
Plot.plot({
marks: [
// Aquí van los elementos visuales
]
})
Componentes principales:
- Plot.plot(): función responsable de crear el gráfico completo
- marks: []: lista en la que se definen los elementos visuales que se mostrarán
¿Qué son las marks (marcas)?
Las marcas son los elementos visuales encargados de representar los datos. Constituyen los "bloques de construcción" fundamentales de cualquier visualización en Observable Plot.
Tipos de marcas comunes:
- Barras: utilizadas para comparar cantidades
- Puntos: empleados para mostrar valores individuales
- Líneas: adecuadas para representar tendencias
- Áreas: útiles para mostrar proporciones
- Cajas: empleadas para visualizar distribuciones estadísticas
Cada tipo de marca resulta adecuado para distintos objetivos de análisis.
Visualización de una variable
La variable "life_expectancy" (expectativa de vida) puede representarse de múltiples formas visuales. En los siguientes ejemplos se utilizan exactamente los mismos datos; lo único que varía es la manera en que se representan gráficamente.
Histograma
Un histograma permite visualizar la cantidad de países cuya expectativa de vida se encuentra dentro de determinados rangos de valores.
Ver código Plot.plot histograma
Plot.plot({
marks: [
Plot.rectY(
datos,
Plot.binX(
{ y: "count" },
{
x: "life_expectancy",
fill: "#9B1C26",
}
)
),
Plot.ruleY([0]),
],
})
¿Qué hace cada parte?
- Plot.rectY(): crea rectángulos verticales que representan los intervalos del histograma
- datos: conjunto de datos que se desea visualizar
- Plot.binX(): agrupa los valores numéricos en intervalos (bins o contenedores)
- { y: "count" }: contabiliza cuántos valores hay dentro de cada contenedor
- { x: "life_expectancy" }: variable numérica que se analiza
- Plot.ruleY([0]): dibuja una línea base en el eje Y en el valor 0
¿Qué indica este gráfico?
El histograma muestra que la mayoría de los países presentan una expectativa de vida situada entre los 70 y 80 años. En los extremos de la distribución se observa un número reducido de países con valores notablemente bajos (entre 50 y 60 años) o excepcionalmente altos (por encima de 85 años).
¿Cuándo utilizar histogramas?
- Para analizar la distribución de una variable numérica
- Para identificar los valores más frecuentes y los menos comunes
- Para detectar patrones generales o concentraciones en los datos
Gráfico de trazos (Strip Plot)
En esta representación, cada país se visualiza como una línea vertical fina. Esto permite ver la distribución de los datos y dónde se concentran, preservando cada observación individual.
Ver código Plot.plot strip plot
Plot.plot({
height: 100,
marks: [
Plot.tickX(datos, {
x: "life_expectancy",
stroke: "#9B1C26",
strokeOpacity: 0.3,
}),
],
})
¿Qué hace cada parte?
- Plot.tickX(): crea líneas verticales delgadas para representar cada observación
- { x: "life_expectancy" }: define la posición horizontal de cada trazo según su valor
- strokeOpacity: 0.3: semitransparencia para ver superposiciones (donde hay más trazos, la zona se ve más oscura)
¿Qué indica este gráfico?
Este gráfico permite observar cada país de manera individual y ver claramente dónde se concentran los datos: la zona entre 70 y 80 años aparece más oscura por la densidad de trazos superpuestos. Los países con valores atípicos (muy bajos o muy altos) se distinguen fácilmente en los extremos.
¿Cuándo utilizar gráficos de trazos?
- Para visualizar valores individuales sin perder datos por superposición
- Para identificar outliers (valores atípicos)
- Para ver la densidad relativa en diferentes rangos
- Cuando se busca una representación compacta y minimalista
Diagrama de caja (Box Plot)
Este tipo de gráfico resume la distribución completa de los datos mediante una caja acompañada de líneas. Su verdadero potencial se revela al comparar distribuciones entre grupos.
Ver código Plot.plot box plot
Plot.plot({
marks: [
Plot.boxY(datos, {
x: "continent",
y: "life_expectancy",
}),
],
})
¿Cómo interpretar este gráfico?
- Línea central dentro de la caja: representa la mediana, es decir, el valor central de la distribución
- Bordes inferior y superior de la caja: corresponden al 25 % y al 75 % de los datos (rango intercuartílico)
- Líneas externas (bigotes): indican los valores mínimo y máximo considerados normales
- Puntos individuales: representan valores atípicos (outliers), alejados del resto de la distribución
¿Qué indica este gráfico?
El diagrama permite comparar la expectativa de vida entre continentes. Se observa que Europa tiene una mediana alta con poca variación, mientras que África presenta valores más bajos y mayor dispersión. Este tipo de comparación sería difícil de hacer con un histograma.
¿Cuándo utilizar diagramas de caja?
- Para comparar distribuciones entre múltiples grupos
- Para presentar resúmenes estadísticos de forma rápida y clara
- Para detectar diferencias de mediana, dispersión y valores atípicos entre categorías
Área bajo la curva
Esta representación corresponde a una versión suavizada del histograma, utilizada para mostrar la forma general de la distribución de los datos de manera continua.
Ver código Plot.plot área bajo la curva
Plot.plot({
marks: [
Plot.areaY(
datos,
Plot.binX(
{ y: "count" },
{
x: "life_expectancy",
fill: "#9B1C26",
fillOpacity: 0.5,
curve: "basis",
}
)
),
Plot.ruleY([0]),
],
})
¿Qué hace cada parte?
- Plot.areaY(): crea un área rellena que representa la magnitud de los valores a lo largo del eje correspondiente
- curve: "basis": aplica un suavizado a la línea, generando una curva continua en lugar de segmentos angulares
- fillOpacity: 0.5: semitransparencia para suavizar el impacto visual
¿Qué indica este gráfico?
Este gráfico transmite la misma información que un histograma, pero con una apariencia más fluida y continua. Resulta especialmente útil para resaltar la forma general de la distribución sin enfatizar los límites discretos de los intervalos.
¿Cuándo utilizar gráficos de área?
- Para representar formas de distribución de manera continua
- Cuando se busca una estética más suave y menos geométrica
- Para visualizar series temporales que muestran acumulación o evolución progresiva
Visualización de dos variables
Los siguientes gráficos exploran la relación entre dos variables: una numérica contra otra numérica, o una categórica contra una numérica.
Gráfico de dispersión (Scatter Plot)
Los gráficos de dispersión permiten visualizar la relación entre dos variables numéricas. Cada punto representa un país posicionado según sus valores en ambos ejes.
Ver código Plot.plot scatter plot
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "#9B1C26",
fillOpacity: 0.6,
}),
],
})
¿Qué hace cada parte?
- Plot.dot(): crea puntos que representan cada observación individual
- { x: "infant_mortality" }: posiciona cada punto horizontalmente según la mortalidad infantil del país
- { y: "life_expectancy" }: posiciona cada punto verticalmente según la expectativa de vida
- fillOpacity: 0.6: semitransparencia para distinguir puntos superpuestos
¿Qué indica este gráfico?
Se observa una relación negativa clara: a mayor mortalidad infantil, menor expectativa de vida. Los países con baja mortalidad infantil tienden a tener vidas más largas, mientras que los que tienen alta mortalidad infantil se concentran en la parte inferior derecha.
¿Cuándo utilizar gráficos de dispersión?
- Para explorar relaciones entre dos variables numéricas
- Para identificar correlaciones positivas, negativas o ausencia de relación
- Para detectar agrupaciones (clusters) o patrones específicos
- Para identificar casos atípicos en el contexto de dos variables simultáneamente
Dispersión con línea de regresión
Al agregar una línea de regresión sobre un scatter plot, podemos cuantificar y visualizar la tendencia lineal entre las dos variables.
Ver código Plot.plot scatter con regresión
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
fill: "#9B1C26",
fillOpacity: 0.4,
}),
Plot.linearRegressionY(datos, {
x: "infant_mortality",
y: "life_expectancy",
stroke: "#9B1C26",
strokeWidth: 2,
}),
],
})
¿Qué hace cada parte?
- Plot.linearRegressionY(): calcula y dibuja una línea de regresión lineal
- La línea se ajusta automáticamente a los datos usando mínimos cuadrados
- Los puntos se mantienen con mayor transparencia para que la línea de tendencia destaque
¿Qué indica este gráfico?
La línea de regresión confirma la tendencia negativa: por cada aumento en mortalidad infantil, la expectativa de vida disminuye de forma aproximadamente proporcional. La pendiente de la línea cuantifica esta relación.
¿Cuándo utilizar líneas de regresión?
- Para confirmar visualmente una correlación entre dos variables
- Para mostrar la dirección y magnitud de una tendencia
- Para identificar cuánto se desvían las observaciones individuales del patrón general
- Cuando la relación entre variables es aproximadamente lineal
Gráfico de barras verticales
Los gráficos de barras son fundamentales para comparar valores entre diferentes categorías. En este ejemplo filtramos los países de Sudamérica directamente dentro de la llamada al gráfico:
Ver código Plot.plot barras verticales
Plot.plot({
marks: [
Plot.barY(
datos.filter((d) => d.continent === "South America"),
{
x: "country",
y: "life_expectancy",
fill: "#9B1C26",
sort: { x: "-y" },
}
),
Plot.ruleY([0]),
],
})
¿Qué hace cada parte?
- Plot.barY(): crea barras verticales para cada categoría
- datos.filter(d => d.continent === "South America"): selecciona únicamente los países de Sudamérica
- { x: "country" }: utiliza el nombre del país como categoría en el eje X
- { y: "life_expectancy" }: define la altura de cada barra según la expectativa de vida
- sort: {x: "-y"}: ordena las barras de mayor a menor valor
- Plot.ruleY([0]): línea base en cero para referencia visual
¿Qué indica este gráfico?
Este gráfico facilita la comparación directa entre países, permitiendo identificar rápidamente cuáles presentan mayor o menor expectativa de vida dentro de Sudamérica.
¿Cuándo utilizar gráficos de barras?
- Para comparar valores entre diferentes categorías
- Para mostrar rankings o clasificaciones
- Para presentar cantidades absolutas de forma clara
- Cuando se desea facilitar la comparación visual entre elementos discretos
Gráfico de barras horizontales
Las barras horizontales son particularmente útiles cuando los nombres de las categorías son largos o cuando se desea enfatizar el orden de los valores.
Ver código Plot.plot barras horizontales
Plot.plot({
marginLeft: 100,
marks: [
Plot.barX(
datos.filter((d) => d.continent === "South America"),
{
y: "country",
x: "life_expectancy",
fill: "#9B1C26",
sort: { y: "-x" },
}
),
Plot.ruleX([0]),
],
})
¿Qué hace cada parte?
- Plot.barX(): crea barras horizontales (la longitud representa el valor)
- { y: "country" }: posiciona cada país en el eje vertical
- { x: "life_expectancy" }: define la longitud de cada barra
- sort: {y: "-x"}: ordena los países de mayor a menor valor
- marginLeft: 100: amplía el margen izquierdo para que los nombres de países se lean completos
¿Qué indica este gráfico?
La disposición horizontal permite leer los nombres de los países con mayor comodidad y facilita la comparación de valores que se extienden hacia la derecha. El ordenamiento de mayor a menor crea un ranking visual inmediato.
¿Cuándo utilizar barras horizontales?
- Cuando las etiquetas de categorías son largas (nombres de países, ciudades, productos)
- Para rankings donde se lee de arriba hacia abajo
- Cuando se desea una lectura más natural de izquierda a derecha
- Para facilitar la comparación visual en listas extensas
Gráfico de paletas (Lollipop)
El gráfico de paletas es una alternativa moderna a las barras horizontales que utiliza una línea delgada con un punto terminal. Reduce la "tinta visual" y enfatiza la posición exacta del valor.
Ver código Plot.plot lollipop
Plot.plot({
marginLeft: 100,
marks: [
Plot.link(
datos.filter((d) => d.continent === "South America"),
{
x1: 0,
y1: "country",
x2: "life_expectancy",
y2: "country",
stroke: "#9B1C26",
sort: { y1: "-x2" },
}
),
Plot.dot(
datos.filter((d) => d.continent === "South America"),
{
x: "life_expectancy",
y: "country",
fill: "#9B1C26",
r: 5,
sort: { y: "-x" },
}
),
Plot.ruleX([0]),
],
})
¿Qué hace cada parte?
- Plot.link(): dibuja una línea que conecta dos puntos (desde x1=0 hasta x2=valor) para cada país
- Plot.dot(): agrega un punto al final de cada línea
- r: 5: radio del punto terminal
- sort: {y: "-x"}: ordena de mayor a menor, igual que las barras
¿Qué indica este gráfico?
Transmite la misma información que un gráfico de barras horizontales, pero con un aspecto más ligero. Al usar menos área de relleno, resulta más fácil comparar valores cercanos y detectar diferencias sutiles entre países.
¿Cuándo utilizar gráficos de paletas?
- Como alternativa a barras cuando se desea un aspecto más limpio
- Cuando las diferencias entre valores son pequeñas y se necesita mayor precisión visual
- Para rankings donde la posición exacta es más importante que el volumen
Visualización de tres o más variables
Los gráficos pueden representar múltiples variables simultáneamente usando canales visuales adicionales como tamaño y color.
Gráfico de burbujas (Bubble Chart)
Los puntos pueden variar en tamaño y color para representar variables adicionales, creando lo que se conoce como bubble chart (gráfico de burbujas).
Ver código Plot.plot bubble chart
Plot.plot({
marks: [
Plot.dot(datos, {
x: "infant_mortality",
y: "life_expectancy",
r: "population",
fill: "continent",
fillOpacity: 0.7,
stroke: "white",
strokeWidth: 0.5,
}),
],
})
¿Qué hace cada parte?
- Plot.dot(): crea puntos de tamaño y color variable
- { x: "infant_mortality", y: "life_expectancy" }: posiciona cada punto según dos variables
- { r: "population" }: define el radio de cada punto según la población del país
- { fill: "continent" }: colorea cada punto según su continente
- fillOpacity: 0.7: semitransparencia para ver puntos superpuestos
- stroke: "white": borde blanco que mejora la separación visual entre puntos
¿Qué indica este gráfico?
Este gráfico permite visualizar cuatro variables simultáneamente: mortalidad infantil (eje X), expectativa de vida (eje Y), población (tamaño del punto) y continente (color). Se observa que los países africanos tienden a concentrarse en la zona de alta mortalidad y baja expectativa, mientras que los europeos se agrupan en el extremo opuesto.
¿Cuándo utilizar gráficos de burbujas?
- Para representar tres o más dimensiones de información en un plano bidimensional
- Cuando se desea incorporar la magnitud de una tercera variable (tamaño) y una cuarta (color)
- Para resaltar la importancia relativa de cada observación
- En análisis multivariados donde tamaño y color añaden contexto relevante
Tabla de referencia completa
| Tipo de gráfico | Función Plot | Variables necesarias | Mejor para |
|---|---|---|---|
| Histograma | Plot.rectY() + Plot.binX() | 1 numérica | Distribuciones |
| Strip plot | Plot.tickX() | 1 numérica | Valores individuales, densidad |
| Diagrama de caja | Plot.boxX() o Plot.boxY() | 1 numérica + 1 categórica | Comparar distribuciones entre grupos |
| Área | Plot.areaY() + Plot.binX() | 1 numérica | Distribución continua |
| Scatter plot | Plot.dot() | 2 numéricas | Relaciones bivariadas |
| Scatter + regresión | Plot.dot() + Plot.linearRegressionY() | 2 numéricas | Confirmar tendencias lineales |
| Barras verticales | Plot.barY() | 1 categórica + 1 numérica | Comparaciones |
| Barras horizontales | Plot.barX() | 1 categórica + 1 numérica | Rankings, nombres largos |
| Lollipop | Plot.link() + Plot.dot() | 1 categórica + 1 numérica | Rankings precisos, aspecto limpio |
| Burbujas | Plot.dot() con r y fill | 3+ variables | Análisis multivariado |
| Líneas | Plot.line() | 2 numéricas (ordenadas) | Series temporales |
Esta taxonomía de tipos de gráficos se basa en la gramática de gráficos (Wilkinson, 2005), (Wickham, 2010).
Conclusiones de la lección
En esta primera lección se han presentado los conceptos fundamentales de Observable Plot y se ha explorado cómo una misma variable puede representarse mediante distintos enfoques visuales.
Conceptos clave
Observable Plot
- Biblioteca declarativa que simplifica la creación de visualizaciones
- Basada en la función principal
Plot.plot() - Automatiza aspectos técnicos como ejes, escalas y dimensiones
Marcas (marks)
- Elementos visuales fundamentales que representan los datos
- Se definen dentro del array
marks: [] - Cada tipo de marca cumple un propósito específico
Tipos de visualización explorados
- Una variable: histograma, strip plot, diagrama de caja, área
- Dos variables: scatter plot, scatter con regresión, barras verticales, barras horizontales, lollipop
- Tres o más variables: gráfico de burbujas
Reflexión final
No existe una única forma "correcta" de visualizar datos. La elección del tipo de gráfico depende de:
- El mensaje que se desea comunicar
- La audiencia a la que va dirigido
- El contexto en el que se presenta la información
- El nivel de detalle que se requiere mostrar
Un histograma puede ser ideal para mostrar distribuciones generales, mientras que un strip plot permite ver la densidad real de las observaciones. Un diagrama de caja brilla al comparar grupos, y un gráfico de burbujas permite explorar relaciones multivariadas. La clave está en comprender las fortalezas de cada tipo de visualización y elegir la más apropiada para la historia que se desea contar.
Próximo paso: En la Color y Estilos se explorará el sistema de color y estilos en Observable Plot, aprendiendo a personalizar la apariencia visual de los gráficos mediante propiedades como fill, stroke, opacidad y grosor de líneas.