Visualización de espectros Python
Python constituye uno de los entornos más flexibles para el tratamiento y la visualización de datos NIR, especialmente en contextos académicos. Su capacidad para integrar cálculos, pretratamientos, visualización interactiva y generación de figuras dentro de un mismo script lo convierte en una herramienta extremadamente potente, aunque exige mayor implicación técnica por parte del usuario. En este estudio se emplean los mismos espectros utilizados en las publicaciones anteriores, correspondientes a una hierba aromática procesada en distintos tamaños de partícula, con el objetivo de comparar cómo diferentes plataformas representan las variaciones físicas de la muestra.
El flujo de trabajo mostrado en este análisis ha sido elaborado con la ayuda de Alejandro Gutiérrez, quien desarrolló la estructura principal del script, y apoyado en la librería abierta Chemotools, desarrollada por Pau Cabañeros López. Esta herramienta permite trabajar con datos espectrales dentro de un entorno accesible y reproducible, ofreciendo módulos específicos para preprocesamiento, análisis y visualización.
Para este estudio se parte de un archivo .csv adaptado al script, donde la primera columna corresponde al nombre de cada muestra (Name), seguida de las longitudes de onda. El código requiere esta estructura para cargar correctamente los espectros.
Una vez cargados los datos, la visualización de los espectros en Python resulta sorprendentemente fluida. Se permite ampliar regiones específicas, desplazarse por la huella espectral, regresar al encuadre inicial y exportar imágenes limpias de alta calidad sobre fondo blanco. Desde el punto de vista de nitidez y flexibilidad gráfica, la experiencia es comparable a la de Spectrify, conservando al mismo tiempo la libertad absoluta que caracteriza a un entorno de programación.
En cuanto a los pretratamientos aplicados, se replican los utilizados en publicaciones anteriores: datos en crudo, SNV, derivada de primer orden y la combinación SNV+1D. Al igual que ocurre en Spectrify, encadenar múltiples pretratamientos en Python requiere definir un pipeline dentro del script, especificando el orden de ejecución. Este enfoque ofrece un control total sobre el flujo de trabajo, pero añade la necesidad de una correcta secuencia de líneas. Cualquier error en un paso previo puede inhabilitar operaciones posteriores; por ejemplo, el cambio de color de los espectros dentro del pipeline depende de que la configuración inicial del gráfico haya sido definida correctamente en una sección anterior del código.
Aunque en el vídeo no se emplea clasificación por colores, Python permite realizar esta operación de forma directa si se incluye una columna Class en el archivo .csv y se incorpora en el script un diccionario que asigne un color a cada grupo. Esta posibilidad ofrece un control muy preciso de la representación visual, aunque requiere ciertos ajustes de programación.
Python ofrece un entorno de enorme potencia y flexibilidad, sin embargo su uso en entornos industriales puede resultar más exigente debido a la necesidad de escribir, depurar y mantener el código. Los softwares específicos como SIMCA, FOSS Calibrator o The Unscrambler reducen significativamente la carga técnica, permitiendo al usuario centrarse en la interpretación sin necesidad de construir el flujo de trabajo desde cero. Sin embargo, en entornos académicos, donde se prioriza la reproducibilidad, la libertad metodológica y la posibilidad de personalizar cada etapa del análisis, Python representa un recurso de valor incalculable.
La visualización completa del proceso, junto con la ejecución de los diferentes pretratamientos y la comparación interactiva de las señales espectrales, puede consultarse en el vídeo insertado.
El código Python utilizado en este análisis listo para copiar, pegar y ejecutar con los datos (NOMBRE DEL ARCHIVO) de cada usuario:
1. Cargar los datos
from google.colab import files
import pandas as pd
#uploaded = files.upload()
#print(list(uploaded.keys()))
data = pd.read_csv('.csv', encoding='latin1', sep=';')
data.head(22)
2. Graficar los espectros
import matplotlib.pyplot as plt
def plot_spectra(
df,
title='Espectra',
xlabel='Wavelength (nm)',
ylabel='Intensity',
colors=['black']
):
spectra_names = df["Name"]
wavelengths = df.columns[1:].astype(float)
plt.figure(figsize=(12, 6))
for i, row in df.iterrows():
spectrum_name = spectra_names[i]
values =
row.iloc[1:].astype(float)
color = colors[i % len(colors)]
# Cicla colores si hay más espectros que colores
plt.plot(wavelengths, values,
label=spectrum_name , color=color)
plt.title(title)
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.legend()
plt.show()
plot_spectra(data)
3. Graficar espectros de forma interactiva
def plot_spectra_interactive(
df,
title='Spectra (interactive)',
xlabel='Wavelength (nm)',
ylabel='Intensity',
colors = ['black'] # Elige
los colores que prefieras
):
wavelengths = df.columns[1:].astype(float)
fig = go.Figure()
for i, row in df.iterrows():
color = colors[i % len(colors)]
fig.add_trace(go.Scatter(
x=wavelengths,
y=row.iloc[1:].astype(float),
mode='lines',
name=row.iloc[0],
line=dict(color=color)
))
fig.update_layout(
title=title,
xaxis_title=xlabel,
yaxis_title=ylabel,
height=600
)
fig.show()
plot_spectra_interactive(data)
4. Preprocesamiento: Standard Normal Variate (SNV)
from chemotools.scatter import StandardNormalVariate
X = data.iloc[:, 1:].to_numpy(dtype=float)
snv = StandardNormalVariate()
snv_spectra = snv.fit_transform(X)
snv_df = pd.DataFrame(snv_spectra, columns=data.columns[1:],
index=data.index)
snv_df.insert(0, "Name", data["Name"])
plot_spectra_interactive(snv_df, title="Standard Normal
Variate (chemotools) ")
5. Preprocesamiento: Derivada de Savitzky–Golay
from chemotools.derivative import SavitzkyGolay
derivative = SavitzkyGolay(window_size=11,
polynomial_order=2)
deriv_spectra = derivative.fit_transform(X)
deriv_df = pd.DataFrame(deriv_spectra,
columns=data.columns[1:], index=data.index)
deriv_df.insert(0, "Name", data["Name"])
plot_spectra_interactive(deriv_df,
title="Savitzky–Golay First Derivative
(chemotools)",ylabel='Intensity (1st deriv.)')
6. Pipeline de preprocesamiento combinado
from sklearn.pipeline import Pipeline
pipeline = Pipeline([
("snv", snv),
("sg", derivative),
])
processed_spectra = pipeline.fit_transform(X)
processed_df = pd.DataFrame(processed_spectra,
columns=data.columns[1:], index=data.index)
processed_df.insert(0, "Name",
data["Name"])
plot_spectra_interactive(processed_df, title="SNV + 1st
Derivative",ylabel='Intensity',)
Comentarios
Publicar un comentario
Si le ha parecido motivo de debate.
Si quiere hacer alguna consulta sobre el tema.
Si tiene algún comentario, este es su sitio.