Diagramas Termodinámicos Skew-T ln-P y Análisis de Sondeos Atmosféricos en Python.
Modern, high-performance Skew-T ln-P thermodynamic diagram engine and sounding analysis in Python.
PySkewT v2 es una reescritura moderna, modular y altamente optimizada del proyecto original, diseñada tanto para análisis operacional en meteorología como para investigación y docencia:
- ⚡ Rendimiento 10x superior: Grilla de fondo generada en menos de 120 ms mediante
LineCollectionvectorizado de Matplotlib, reemplazando bucles iterativos lentos. - 🎯 Precisión Científica y Termodinámica Rigurosa:
- Fórmulas de Bolton (1980) y estándares de la OMM (WMO) para presiones de vapor de saturación
$e_s(T)$ y relaciones de mezcla$w_s(T, p)$ . - Integración numérica de pseudoadiabatas húmedas mediante Runge-Kutta de 4to orden (RK4) estable y continuo en toda la tropósfera.
- Fórmulas de Bolton (1980) y estándares de la OMM (WMO) para presiones de vapor de saturación
- 📊 Diagnóstico Convectivo Automatizado:
- LCL (Nivel de Condensación por Ascenso) con temperatura y presión exactas.
- LFC (Nivel de Convección Libre) y EL (Nivel de Equilibrio).
- CAPE (Convective Available Potential Energy) y CIN (Convective Inhibition).
- Lifted Index (LI), K-Index, Total Totals (TT) y Agua Precipitable (PW).
- 🎨 Visualización de Calidad de Publicación y Temas:
-
Sistema de Paletas de Colores: Alterná instantáneamente entre
modern(limpio y de alto contraste),dark(modo oscuro operacional),classic(estilo papel meteorológico tradicional) oaccessible(seguro para daltonismo / Okabe-Ito). - Sombreado automático de CAPE (rojo/coral traslúcido) y CIN (azul celeste/cian).
- Trayectoria gráfica del ascenso de la parcela superficial (
$T_{parcel}$ ). - Resalte visual de la isoterma de 0°C (nivel de congelamiento) en azul celeste.
- Columna lateral dedicada para barbas de viento (wind barbs) con muestreo inteligente anti-solapamiento.
- HUD resumen con todos los parámetros termodinámicos en la esquina superior.
-
Sistema de Paletas de Colores: Alterná instantáneamente entre
- 📁 Lector Universal de Sondeos: Compatibilidad directa con archivos de la Universidad de Wyoming (UWYO), tablas ASCII/CSV y arreglos de NumPy.
- 🔄 100% Retrocompatible: Mantiene la interfaz original de la v1 (
SkewT.py) sin romper scripts existentes.
Podés instalar el paquete en modo editable o directamente desde el repositorio:
git clone https://github.com/rodriuru/PyskewT.git
cd PyskewT
pip install .python >= 3.8numpy >= 1.20matplotlib >= 3.5scipy >= 1.7
Generar un diagrama completo a partir de un sondeo en formato Wyoming (sondeo3.txt):
# Ejecutar con el tema por defecto (modern)
python3 -m pyskewt sondeo3.txt -o sondeo_modern.png
# O en Modo Oscuro (ideal para dashboards o pantallas nocturnas)
python3 -m pyskewt sondeo3.txt --theme dark -o sondeo_dark.png
# O con paleta Accesible (segura para daltonismo)
python3 -m pyskewt sondeo3.txt --theme accessible -o sondeo_accessible.png
# O estilo Clásico tradicional de papel
python3 -m pyskewt sondeo3.txt --theme classic -o sondeo_classic.pngOpciones disponibles en el CLI:
pyskewt [-h] [-o OUTPUT] [--theme {modern,dark,classic,accessible}] [--dpi DPI] [--title TITLE] [--no-winds] [--no-parcel] [--show] archivo
from pyskewt import SkewT, Sounding
# 1. Cargar sondeo (formato Wyoming o texto)
sounding = Sounding.from_file("sondeo3.txt")
# 2. Inicializar diagrama seleccionando tema ('modern', 'dark', 'classic', o 'accessible')
skew = SkewT(theme="dark", with_wind_barbs=True)
# 3. Dibujar grilla termodinámica de fondo
skew.draw_background()
# 4. Trazar perfiles y calcular parámetros
indices = skew.plot_sounding(
sounding,
plot_parcel=True,
shade_cape_cin=True,
plot_winds=True,
title="Sondeo Atmosférico - Skew-T ln-P (Modo Oscuro)"
)
# 5. Guardar en alta definición
skew.save("salida_dark.png", dpi=300)
print(f"CAPE: {indices['cape']:.1f} J/kg | LCL: {indices['p_lcl']:.1f} hPa")Si tenés scripts que usaban la versión anterior:
from SkewT import SkewT
import numpy as np
m = SkewT(1)
m.draw_background()
sondeo = np.loadtxt("sondeo3.txt", skiprows=4)
m.graficar(sondeo)
m.fig.savefig("aa.png", dpi=300)| Característica | PySkewT v1 (2021) | PySkewT v2 (2026) | Mejora |
|---|---|---|---|
| Generación de grilla de fondo | Bucles individuales ax.plot (~850 ms) |
LineCollection vectorizado (~118 ms) |
~7x más rápido |
| Integración de pseudoadiabatas | Euler directo con paso fijo | Runge-Kutta 4to orden (RK4) | Precisión O(h⁴) y estable |
| Cálculo de CAPE / CIN / LCL | No disponible / Manual | Automático integrado (~50 ms) | Nuevo en v2 |
| Barbas de Viento | No disponible | Columna lateral dedicada | Nuevo en v2 |
| Compatibilidad NumPy 2.x | Incompatible (np.trapz) |
Totalmente compatible | 100% compatible |
Para ejecutar el benchmark en tu entorno:
python3 examples/benchmark_v1_vs_v2.pyPara correr la suite de pruebas unitarias:
python3 -m unittest discover -s tests -v-
Transformación Skew-T:
$$x = T - \beta \ln\left(\frac{p}{p_0}\right), \quad y = -\ln(p)$$ donde$\beta = 40.0$ y$p_0 = 1000\text{ hPa}$ , lo que otorga la inclinación clásica de 45° a las isotermas. -
Presión de Vapor de Saturación (Bolton 1980):
$$e_s(T) = 6.112 \exp\left(\frac{17.67 \cdot T}{T + 243.5}\right)\text{ hPa}$$ -
Gradiente Adiabático Húmedo:
$$\frac{dT}{dp} = \frac{R_d T}{p c_p} \left[ \frac{1 + \frac{L_v w_s}{R_d T}}{1 + \frac{\epsilon L_v^2 w_s}{c_p R_d T^2}} \right]$$
Este proyecto está bajo la Licencia GNU General Public License v3.0 (GPL-3.0). Ver el archivo LICENSE para más detalles.
