Fundamentos de graficación#

El módulo chemotools.plotting está diseñado para hacer que la visualización de datos espectroscópicos y modelos quimiométricos sea rápida, intuitiva y lista para publicación. En lugar de escribir código repetitivo de matplotlib, puede generar gráficos quimiométricos estándar con solo unas pocas líneas.

Advertencia

El módulo de graficación es experimental y está en desarrollo activo. La API puede cambiar en versiones futuras. Agradecemos sus comentarios. Informe problemas o sugerencias en: paucablop/chemotools#issues

¿Por qué una graficación especializada?#

Visualizar datos espectrales de alta dimensión y modelos quimiométricos suele requerir código de graficación repetitivo y extenso. chemotools simplifica esto proporcionando:

  • Gráficos específicos del dominio: Espectros, puntuaciones, cargas y gráficos de valores atípicos listos para usar.

  • Exploración interactiva: Método rápido show() para retroalimentación inmediata.

  • Calidad de publicación: Estética limpia y estandarizada que luce bien en artículos científicos.

Filosofía de diseño#

El módulo de graficación está construido alrededor de un Protocolo de Visualización consistente, diseñado para equilibrar facilidad de uso y flexibilidad.

  1. Orientado a objetos: Cada tipo de gráfico (por ejemplo, SpectraPlot, ScoresPlot) es una clase que contiene sus datos y configuración.

  2. Dos modos de operación:

    • show(): Crea una nueva figura al instante. Perfecto para exploración rápida.

    • render(ax): Dibuja el gráfico en un eje existente de matplotlib. Diseñado para construir figuras avanzadas multipanel y tableros.

  3. Integración con Matplotlib: Todos los gráficos devuelven objetos estándar matplotlib.axes.Axes, permitiéndole añadir anotaciones, líneas o estilos personalizados usando comandos conocidos de matplotlib.

A continuación se muestra una vista general de la arquitectura de graficación:

../_images/plotting_abstraction.png

Nota

Dado que la graficación de chemotools está construida sobre matplotlib, puede usar todos sus comandos favoritos de matplotlib para personalizar los gráficos generados por render() o show().

Visualización de espectros#

SpectraPlot es su herramienta principal para el análisis exploratorio de datos. Ofrece formas flexibles de visualizar datos espectrales.

Para este ejemplo, usaremos el conjunto de datos de fermentación de chemotools.

from chemotools.datasets import load_fermentation_train
from chemotools.feature_selection import RangeCut

import numpy as np

# Load data
X, Y = load_fermentation_train()
wavenumbers = X.columns.values
y = Y["glucose"]
X = X.values

# Measuring date
measuring_date = np.array(["2023-01-01"] * 10 + ["2023-01-02"] * 11)

1. Visualización rápida

Para inspeccionar rápidamente sus datos, simplemente proporcione los números de onda y la matriz de espectros. Esto grafica todos los espectros en un solo color.

# Create plot object
plot = SpectraPlot(x=wavenumbers, y=X)

# Display it
fig = plot.show(title="All Spectra", ylabel="Absorbance")
../_images/spectra_full.png

Durante la exploración, puede que desee inspeccionar una región específica del espectro. Puede hacerlo especificando xlim en el método show() (ver más adelante).

# Display it
fig = plot.show(title="All Spectra", ylabel="Absorbance", xlim=(900, 1500))
../_images/spectra_zoomed.png

Nota

SpectraPlot gestiona automáticamente la escala del eje y en función del rango de datos. También puede establecer manualmente ylim para centrarse en características específicas.

2. Coloreo por variable continua

Puede colorear los espectros según una variable continua objetivo (como la concentración de glucosa) para visualizar correlaciones.

# Create plot object
plot = SpectraPlot(x=wavenumbers, y=X, color_by=y)

# Display it
fig = plot.show(title="All Spectra", ylabel="Absorbance", xlim=(900, 1500))
../_images/spectra_colored_continuous.png

3. Coloreo por variable categórica

Si dispone de datos categóricos (por ejemplo, lotes o condiciones experimentales), puede colorear por grupos.

# Create plot object
plot = SpectraPlot(x=wavenumbers, y=X, color_by=measuring_date, color_mode="categorical")

# Display it
fig = plot.show(title="All Spectra", ylabel="Absorbance", xlim=(900, 1500))
../_images/spectra_colored_categorical.png

Análisis de modelos#

Después de ajustar un modelo quimiométrico (como PCA o PLS), visualizar los resultados es crucial para su interpretación. Para esta sección, utilizaremos un modelo PCA de ejemplo ajustado con los datos de fermentación de chemotools.

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# Fit a PCA model
pca = PCA(n_components=3)
scores = pca.fit_transform(X)

Varianza explicada: selección de componentes

Antes de analizar las puntuaciones y las cargas, suele ser útil comprobar cuánta varianza explica cada componente. ExplainedVariancePlot le ayuda a decidir el número óptimo de componentes.

from chemotools.plotting import ExplainedVariancePlot

# Plot explained variance ratio
plot = ExplainedVariancePlot(pca.explained_variance_ratio_)
fig = plot.show(title="Explained Variance")
../_images/explained_variance.png

Puntuaciones: el espacio de muestras

Utilice ScoresPlot para visualizar cómo se relacionan entre sí las muestras. Esto es esencial para identificar agrupamientos, tendencias o valores atípicos. ScoresPlot es altamente flexible y puede utilizarse para crear figuras compuestas que muestren distintos aspectos de su modelo, como elipses de confianza y anotaciones de muestras.

from chemotools.plotting import ScoresPlot


fig, ax = plt.subplots(1, 2, figsize=(12, 5))

# 1. Simple2D scores plot colored by glucose concentration
plot = ScoresPlot(scores, components=(0, 1), color_by=y)
plot.render(ax=ax[0])
ax[0].set_title("Scores Plot")

# 2. Advanced scores plot with confidence ellipse and annotations
sample_names = [f"{i}" for i in range(len(scores))]
plot = ScoresPlot(
    scores,
    confidence_ellipse=0.9,
    annotations=sample_names,
    components=(0, 1),
    color_by=y,
)
plot.render(ax=ax[1])
ax[1].set_title("Scores Plot with Annotations")
../_images/scores_advanced.png

Nota

Como estamos componiendo dos gráficos en una sola figura, utilizamos el método render(ax=...) para dibujar cada gráfico en ejes específicos. Esto permite un control preciso sobre el diseño y el estilo.

Cargas: el espacio de características

Utilice LoadingsPlot para entender qué características espectrales contribuyen más al modelo.

from chemotools.plotting import LoadingsPlot

loadings = pca.components_.T

# Plot loadings for the first component
plot = LoadingsPlot(loadings, feature_names=wavenumbers, components=0)
fig = plot.show(title="PC1 Loadings", ylabel="Loading Coefficient")
../_images/loadings_example.png

Detección de valores atípicos

Use DistancesPlot para identificar muestras que no se ajustan bien al modelo, utilizando métricas como T² de Hotelling y residuos Q. Consulte Valores atípicos para más detalles sobre el cálculo de estas estadísticas.

from chemotools.outliers import HotellingT2, QResiduals

# Calculate outlier statistics
hotelling = HotellingT2(pca).fit(X)
q_residuals = QResiduals(pca).fit(X)

Ahora estamos listos para visualizar los resultados.

from chemotools.plotting import DistancesPlot

# Plot T² vs Q-residuals
plot = DistancesPlot(
    x=hotelling.predict_residuals(X_cut),
    y=q_residuals.predict_residuals(X_cut),
    confidence_lines=(hotelling.critical_value_, q_residuals.critical_value_),
    color_by=y,
).render(ax=ax[0],xlabel="Hotelling's T²", ylabel="Q Residuals")

plot = DistancesPlot(
    x=hotelling.predict_residuals(X_cut),
    y=q_residuals.predict_residuals(X_cut),
    confidence_lines=(hotelling.critical_value_, q_residuals.critical_value_),
    color_by=measuring_date,
    annotations=temperatures,
).render(ax=ax[1],xlabel="Hotelling's T²", ylabel="Q Residuals")
../_images/outliers_example.png

Evaluación de predicciones#

Para modelos de regresión, PredictedVsActualPlot proporciona una forma estándar de evaluar el rendimiento del modelo.

from chemotools.plotting import PredictedVsActualPlot, YResidualsPlot
y_residuals = y_test - y_pred

# Assume y_pred comes from a PLS model
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
PredictedVsActualPlot(y_true=y_test, y_pred=y_pred).render(
    ax=ax[0], xlabel="Actual (g/L)", ylabel="Predicted (g/L)"
)
YResidualsPlot(residuals=y_residuals, add_confidence_band=True).render(
    ax=ax[1], xlabel="Sample Index", ylabel="Residuals (g/L)"
)
../_images/predictions_example.png

Creación de figuras compuestas#

Todas las clases de graficación admiten el método render(ax=...), que permite colocar gráficos en ejes existentes de matplotlib. Esto es muy útil para crear paneles o figuras comparativas.

import matplotlib.pyplot as plt

# Create a figure with 2 subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# Plot 1: All spectra
SpectraPlot(x=wavenumbers, y=X, color='lightgray').render(ax1)
ax1.set_title("Raw Spectra")

# Plot 2: Mean spectrum
SpectraPlot(x=wavenumbers, y=X.mean(axis=0), color='black').render(ax2)
ax2.set_title("Mean Spectrum")

plt.tight_layout()
plt.show()

Otros gráficos disponibles#

El módulo chemotools.plotting incluye otros gráficos especializados no cubiertos en esta guía:

  • FeatureSelectionPlot: Visualiza la importancia de características y los resultados de selección.

  • QQPlot: Comprueba la normalidad de los residuos.

  • ResidualDistributionPlot: Analiza la distribución de los residuos del modelo.

  • YResidualsPlot: Grafica los residuos frente a los valores predichos.

Consulte la referencia de la API para más detalles sobre estas clases.