¿Cómo comparar gráficamente 3 métodos analíticos?

¿Todavía usa el boxplot? Hay mejores opciones
Fecha de publicación

29 de abril de 2025

¿Cuál gráfico elegir si desea comparar 3 métodos analíticos?

Cuando trabajamos con datos analíticos, elegir la mejor visualización es clave para interpretar correctamente la distribución de los datos.

Uno de los gráficos más populares es el boxplot. Simple, sin embargo, entrega mucha información. Nos permite, incluso, detectar valores discrepantes (outliers, aunque el boxplot no representa un test formal de datos anómalos)

Veamos un ejemplo de un boxplot tradicional:

El siguiente código en R simula datos obtenidos por 3 métodos analíticos para analizar el mismo analito:

  1. HPLC-DAD
  2. HPLC-Fluor
  3. HPLC-MS/MS
# Crear datos simulados de concentraciones químicas en tres grupos
set.seed(123)
data <- data.frame(
  Concentración = c(rnorm(50, mean = 10, sd = 2),
                    rnorm(50, mean = 15, sd = 3),
                    rnorm(50, mean = 20, sd = 4)),
  Grupo = rep(c("HPLC-DAD", "HPLC-Fluo", "HPLC-MS/MS"), each = 50)
)

Note que los datos fueron simulados considerando que los métodos tienen distintas medias y precisiones (desviaciónes estándares de repetibilidad).

Ahora, graficaremos los 3 métodos utilizando un boxplot con el package ggplot2:

library(ggplot2)

# 📊 1. Boxplot tradicional
ggplot(data, aes(x = Grupo, y = Concentración, fill = Grupo)) +
  geom_boxplot(alpha = 0.7) +
  theme_minimal() +
  labs(title = "Fig. 1 Boxplot: Comparación entre 3 métodos analíticos",
       y = "Concentración (mg/L)", x = "Método Analítico") +
  theme(legend.position = "none")

¿Cuál es el problema con los boxplot?

Esconde la forma de las distribución de los datos, la cual es muy útil para evaluar, por ejemplo, si es plausible la suposición de Normalidad.

Tampoco permite ver si los datos tienen una o varias modas. Por ejemplo, cuando se desea asignar el valor de referencia por consenso en un ensayo de intercomparación y se generan dos grupos de datos (modas) representando dos métodos analíticos distintos.

Es decir, si bien el boxplot no muestra la información de manera muy compacta, esconde los patrones subyancentes de los datos.

¿Podemos mejorar el boxplot?

Por supuesto.

Una de las mejoras es superponer los puntos individuales sobre el boxplot. Se puede observar mejor la dispersión, sin embargo, no se aprecia fácilmente la existencia de clusters. En R basta agregar geom_point() al gráfico anterior:

Note la sencillez de ggplot2 : basta sumarle el gráfico de puntos con el signo +.
# 📊 2. Boxplot tradicional + puntos
ggplot(data, aes(x = Grupo, y = Concentración, fill = Grupo)) +
  geom_boxplot(alpha = 0.7) +
  geom_point() +
  theme_minimal() +
  labs(title = "Fig 2. Boxplot: Comparación entre 3 métodos analíticos",
       y = "Concentración (mg/L)", x = "Método Analítico") +
  theme(legend.position = "none")

Los Rainclouds plots al rescate

El raincloud plot es una combinación de diferentes elementos gráficos que representan mejor la distribución de los datos:

} Un boxplot o un gráfico de violín (para mostrar resumen estadístico).

} Un jitter plot (para visualizar cada punto de datos individual).

} Un density plot (para mostrar la distribución de los datos de manera suave).

Este gráfico es particularmente útil cuando queremos una visión detallada de cómo se distribuyen los datos, incluyendo su forma y variabilidad.

Ventajas del Raincloud Plot:

✅ Representa tanto el resumen estadístico como la forma de la distribución.

✅ Permite ver cada punto de datos, evitando pérdida de información.

Observe la siguiente figura hecha con ggplot2:

# 🌧 3. Raincloud Plot
ggplot(data, aes(x = Grupo, y = Concentración, fill = Grupo)) +
  # Agregar distribución (density plot)
  geom_violin(alpha = 0.3, color = NA) +
  # Agregar jitter (puntos individuales)
  geom_jitter(aes(color = Grupo), width = 0.2, alpha = 0.5) +
  # Agregar boxplot encima
  geom_boxplot(width = 0.15, alpha = 0.7, outlier.shape = NA) +
  theme_minimal() +
  labs(title = "Fig 3. Raincloud Plot: Comparación entre 3 métodos analíticos",
       y = "Concentración (mg/L)", x = "Método Analítico") +
  theme(legend.position = "none")

El raincloud plot revela la distribución de los datos, su forma. Entrega mucha más información.

Las posibilidades son muchas. Si necesita una visualización rápida y comparativa, el boxplot es una excelente opción.

Sin embargo, si busca una representación más detallada y visualmente atractiva de la distribución, el raincloud plot es la mejor alternativa.

La elección nos siempre es sencilla para datos analíticos. Algunos conjuntos de datos son muy discretos, es decir, se repiten debido a la baja resolución del instrumento de medición. En esos casos, podemos agregar un gráfico de puntos apilados, tal como se observa en la siguiente figura:

# 4 Raincloud con dotplot

# cargamos las siguientes librerías adicionales

library(ggdist)
library(dplyr)

ggplot(data, aes(x = Grupo, y = Concentración, fill = Grupo)) +
  # Line below sets the Studio Ghibli color pallete, for the sake of nostalgia =)
  #scale_fill_ghibli_d("SpiritedMedium", direction = -1) +
  geom_boxplot(width = 0.1) +
  xlab('Método Analítico') +
  ylab('Concentración (mg/L)') +
  ggtitle("Fig 4. Raincloud Plot + dotplot: Comparación entre 3 métodos analíticos") +
  # theme_classic(base_size=18, base_family="serif")+
  theme_minimal() +
  theme(legend.position = "none") +
  # theme(text = element_text(size=18),
  #       axis.text.x = element_text(angle=0, hjust=.5, vjust = 0.5, color = "black"),
  #       axis.text.y = element_text(color = "black"),
  #       plot.title = element_text(hjust = 0.5),
  #       plot.subtitle = element_text(hjust = 0.5),
  #       legend.position="none") +
  scale_y_continuous(breaks = seq(0, 30, by=5), limits=c(0,30), expand = c(0, 0)) +
  # Line below adds dot plots from {ggdist} package 
  stat_dots(side = "left", justification = 1.12, binwidth = 1.0, dotsize = 0.3, 
            slab_color = NA, slab_linewidth = 0.3, stackratio =1.3) +
  # Line below adds half-violin from {ggdist} package
  stat_halfeye(adjust = .5, width = .6, justification = -.2, .width = 0, 
               point_colour = NA, alpha = 0.5, slab_color = NA)

Anímese. No se abrume por el código R. Todo se aprende.

Todos los químicos(as) necesitamos comunicar información analítica de la forma más clara posible. Sin duda, conocer los dintintos tipos de gráficos la equipará mejor para seleccionar el más apropiado y exponer claramente su punto de vista.

{a}

Durante este año dictaremos varias formaciones de métodos estadísticos modernos aplicados en Química Analítica usando el lenguaje de programación R.

La visualización de datos químicos es uno de los tópicos más importantes en todos los cursos.

Si necesita más información sobre fechas y costos visite www.analytical.cl/cursos

Volver arriba