aboutsummaryrefslogtreecommitdiff
path: root/skewt.py
diff options
context:
space:
mode:
authorGravatar Jonas Gunz <himself@jonasgunz.de> 2023-08-25 12:23:02 +0200
committerGravatar Jonas Gunz <himself@jonasgunz.de> 2023-08-25 12:23:02 +0200
commit7a4b8a91ce5b9bbd2ce806d2463e95634ad8b1a1 (patch)
tree74d99cb96a93c974a84308516d8362f5f0c338d2 /skewt.py
parent42210578d4b6fece59a57c1a5eedec85e89b8a05 (diff)
downloadmeteo_toolbox-7a4b8a91ce5b9bbd2ce806d2463e95634ad8b1a1.tar.gz
skewt with CAPE/CIN and info
Diffstat (limited to 'skewt.py')
-rw-r--r--skewt.py53
1 files changed, 46 insertions, 7 deletions
diff --git a/skewt.py b/skewt.py
index 43bcc91..0b8f4a7 100644
--- a/skewt.py
+++ b/skewt.py
@@ -1,6 +1,8 @@
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
+import numpy as np
+
import metpy.calc as mpcalc
from metpy.cbook import get_test_data
from metpy.plots import add_metpy_logo, Hodograph, SkewT
@@ -12,6 +14,8 @@ class Skewt:
self._T = T
self._Td = Td
+ self._info_lines = []
+
# Create a new figure. The dimensions here give a good aspect ratio
self._fig = plt.figure(figsize=(9, 9))
@@ -46,20 +50,55 @@ class Skewt:
plt.ylabel('$m/s$')
self._skew.plot_barbs(self._p, u, v)
- def addInfo(self, lines):
- # TODO
+ def addInfo(self, line):
+ self._info_lines.append(line)
+
+ def addAnalysis(self, analysis='ccl', shade=False):
+ f = {'ccl': self._cclAnalysis, 'lcl': self._lclAnalysis}
+
+ lvl, parcel = f[analysis]()
+
+ self._skew.plot(self._p, parcel, 'y')
+ self._skew.plot(lvl[0], lvl[1], 'o', markerfacecolor='red', linewidth=1)
+
+ cape, cin = mpcalc.cape_cin(self._p, self._T, self._Td, parcel)
+
+ self.addInfo(f'CAPE {int(cape.magnitude)} $J/kg$ CIN {int(cin.magnitude)} $J/kg$')
+
+ if shade:
+ self._skew.shade_cape(self._p,self._T,parcel)
+ self._skew.shade_cin(self._p,self._T,parcel)
+
+ def _cclAnalysis(self):
+ #p = np.arange(max(self._p).magnitude, min(self._p).magnitude, -50) * units.hPa
+
+ ccl = mpcalc.ccl(self._p,self._T,self._Td)
+ ccl_ground=mpcalc.dry_lapse(self._p[:1], ccl[1], ccl[0])
+ ccl_ground_parcel= mpcalc.parcel_profile(self._p, ccl_ground[0], self._Td[0])
+
+ return (ccl, ccl_ground_parcel)
+
+ def _lclAnalysis(self):
+ ground_parcel= mpcalc.parcel_profile(self._p, self._T[0], self._Td[0])
+ lcl = mpcalc.lcl(self._p[0],self._T[0],self._Td[0])
+
+ return (lcl, ground_parcel)
+
+ def _buildInfoBox(self):
ax = self._fig.add_subplot(self._gs[1,-1])
- ax.text(0, 0, lines, ha='left', va='center', size=12)
+ ax.text(0, 0, '\n'.join(self._info_lines), ha='left', va='center',
+ size=10, fontfamily='monospace')
ax.axis("off")
-
def plot(self, filename=None):
+ self._buildInfoBox()
+
# Add the relevant special lines
#self._skew.ax.set_ylim(max(self._p), min(self._p))
self._skew.ax.set_ylim(1000, 100)
- self._skew.plot_dry_adiabats()
- self._skew.plot_moist_adiabats()
- self._skew.plot_mixing_lines()
+ self._skew.plot_dry_adiabats(linewidth=1)
+ self._skew.plot_moist_adiabats(linewidth=1)
+ self._skew.plot_mixing_lines(linewidth=1)
# Good bounds for aspect ratio
self._skew.ax.set_xlim(-30, 40)