0

I'm plotting some observed soundings with some composite parameters included in the plot, but I'm having a tiny issue with STP output: it always comes with the square brackets.

I tried to check if something with the unities could be causing this, but I didn't find anything wrong.

Ideas?enter image description here

Edit: I'm dumb and forgot to add the code lines

import posixpath
import matplotlib.pyplot as plt
import metpy.calc as mpcalc
import matplotlib.gridspec as gridspec
import numpy as np
from metpy.plots import add_metpy_logo, add_timestamp, SkewT, Hodograph
from metpy.units import units
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from siphon.simplewebservice.wyoming import WyomingUpperAir

def plot_skewt(df):
    # Pull the data out of the dataset and set them as individual variables and assign units.
    height_AGL = (df['height']-df['elevation']).values * units.m
    z = df['height'].values * units.m
    p = df['pressure'].values * units.hPa
    T = df['temperature'].values * units.degC
    Td = df['dewpoint'].values * units.degC
    wind_speed = df['speed'].values * units.knots
    wind_dir = df['direction'].values * units.degrees
    u, v = mpcalc.wind_components(wind_speed, wind_dir)

    # Calculate LCL height and plot as black dot
    lcl_pressure, lcl_temperature = mpcalc.lcl(p[0], T[0], Td[0])
    lfc_pressure, lfc_temperature = mpcalc.lfc(p, T, Td)
    lcl_hgt = np.round(mpcalc.pressure_to_height_std(lcl_pressure), decimals=3).to(units.meter)
    lfc_hgt = np.round(mpcalc.pressure_to_height_std(lfc_pressure), decimals=3).to(units.meter)

    # Calculate thermodynamic parameters
    sb_cape, sb_cin = mpcalc.surface_based_cape_cin(p, T, Td)
    ml_cape, ml_cin = mpcalc.mixed_layer_cape_cin(p, T, Td)
    mu_cape, mu_cin = mpcalc.most_unstable_cape_cin(p, T, Td)
    #lr_700_500 = np.round(-1 * np.divide(T[]-T[], (z[]-z[]).to(units.kilometer)),2)
    sbcape = np.round(sb_cape, 1)
    sbcin = np.round(sb_cin, 1)
    mlcape = np.round(ml_cape, 1)
    mlcin = np.round(ml_cin, 1)
    mucape = np.round(mu_cape, 1)

    # Calculate kinematic parameters

    u_shear01, v_shear01 = mpcalc.bulk_shear(p, u.to(units('m/s')), v.to(units('m/s')), depth = 1000 * units.meter)
    shear01 = np.round((np.sqrt(u_shear01**2 + v_shear01**2)), 1)
    u_shear06, v_shear06 = mpcalc.bulk_shear(p, u.to(units('m/s')), v.to(units('m/s')), depth = 6000 * units.meter)
    shear06 = np.round((np.sqrt(u_shear06**2 + v_shear06**2)), 1)
    rmover, lmover, mean = mpcalc.bunkers_storm_motion(p, u, v, z)
    srh_01_pos, srh_01_neg, srh_01_tot = mpcalc.storm_relative_helicity(u, v, z, depth = 1000 * units.meter, bottom = height_AGL[0], storm_u = lmover[0], storm_v = lmover[1])
    srh_01 = np.round(srh_01_neg, 1)
    srh_03_pos, srh_03_neg, srh_03_tot = mpcalc.storm_relative_helicity(u, v, z, depth = 3000 * units.meter, bottom = height_AGL[0], storm_u = lmover[0], storm_v = lmover[1])
    srh_03 = np.round(srh_03_neg, 1)

    # Calculate composite parameters
    ehi_01 = np.round(np.divide(srh_01_neg * sb_cape, 160000 * ((units.m**2 * units.joule)/(units.s**2 * units.kilogram))), 1)
    ehi_03 = np.round(np.divide(srh_03_neg * sb_cape, 160000 * ((units.m**2 * units.joule)/(units.s**2 * units.kilogram))), 1)
    scp = np.round(np.divide(sb_cape, 1000 * units('J/kg')) * np.divide(shear06, 20 * units('m/s')) * np.divide(srh_03_neg, 100 * (units.m**2/units.s**2)), 1)
    sig_tor =  np.round((mpcalc.significant_tornado(sb_cape, lcl_hgt, srh_01_neg, shear06)), 1)

    # Create a new axis
    ax = plt.figure(figsize=(9,9))

    # Grid for plots
    gs = gridspec.GridSpec(3, 3)
    skew = SkewT(ax, rotation=45, subplot=gs[:,:2])

    # Plot the enviromental temperature and dewpoint profiles
    skew.plot(p, T, 'r')
    skew.plot(p, Td, 'g')

    # Mask barbs to below 100 hPa only
    mask = p >= 100 * units.hPa

    # Plot wind barbs
    skew.plot_barbs(p[mask], u[mask], v[mask], y_clip_radius=0.01)

    # Set axis limits
    skew.ax.set_ylim(1050, 100)
    skew.ax.set_xlim(-25, 40)

    # Calculate full parcel profile and add to plot as black line
    prof = mpcalc.parcel_profile(p, T[0], Td[0]).to('degC')
    skew.plot(p, prof, 'k', linewidth=2)

    # Mark with a dot the LCL and LFC heights
    skew.plot(lcl_pressure, lcl_temperature, 'ko', markerfacecolor='black')
    skew.plot(lfc_pressure, lfc_temperature, 'ko', markerfacecolor='blue')

    # Mask barbs to below 100 hPa only
    mask = p >= 100 * units.hPa

    # Shade CAPE
    skew.shade_cape(p, T, prof)

    # Shade CIN
    skew.shade_cin(p, T, prof)

    # Plot the freezing layer isotherms
    skew.ax.axvline(0, color='c', linestyle='--', linewidth=1)
    skew.ax.axvline(-20, color='c', linestyle='--', linewidth=1)

    # Add the relevant special lines
    skew.plot_dry_adiabats()
    skew.plot_moist_adiabats()
    skew.plot_mixing_lines()

    # Write parameters outputs in the SkewT
    plt.figtext( 0.65, 0.58, 'LCL Height:')
    plt.figtext( 0.8, 0.58, f'{lcl_hgt:~P}')
    plt.figtext( 0.65, 0.56, 'LFC Height:')
    plt.figtext( 0.8, 0.56, f'{lfc_hgt:~P}')
    #plt.figtext( 0.65, 0.54, 'MLLR:')
    #plt.figtext( 0.8, 0.54, f'{lr_700_500:~P}')
    plt.figtext( 0.65, 0.54, 'SBCAPE:')
    plt.figtext( 0.8, 0.54, f'{sbcape:~P}')
    plt.figtext( 0.65, 0.52, 'SBCIN:')
    plt.figtext( 0.8, 0.52, f'{sbcin:~P}')
    plt.figtext( 0.65, 0.50, 'MLCAPE:')
    plt.figtext( 0.8, 0.50, f'{mlcape:~P}')
    plt.figtext( 0.65, 0.48, 'MLCIN:')
    plt.figtext( 0.8, 0.48, f'{mlcin:~P}')
    plt.figtext( 0.65, 0.46, 'MUCAPE:')
    plt.figtext( 0.8, 0.46, f'{mucape:~P}')
    plt.figtext( 0.65, 0.44, 'Shear 0-1 km:')
    plt.figtext( 0.8, 0.44, f'{shear01:~P}')
    plt.figtext( 0.65, 0.42, 'Shear 0-6 km:')
    plt.figtext( 0.8, 0.42, f'{shear06:~P}')
    plt.figtext( 0.65, 0.40, 'SRH 0-1 km:')
    plt.figtext( 0.8, 0.40, f'{srh_01:~P}')
    plt.figtext( 0.65, 0.38, 'SRH 0-3 km:')
    plt.figtext( 0.8, 0.38, f'{srh_03:~P}')
    plt.figtext( 0.65, 0.36, 'EHI 0-1 km:')
    plt.figtext( 0.8, 0.36, f'{ehi_01:~P}')
    plt.figtext( 0.65, 0.34, 'EHI 0-3 km:')
    plt.figtext( 0.8, 0.34, f'{ehi_03:~P}')
    plt.figtext( 0.65, 0.32, 'SCP:')
    plt.figtext( 0.8, 0.32, f'{scp:~P}')
    plt.figtext( 0.65, 0.30, 'SIGTOR (FL):')
    plt.figtext( 0.8, 0.30, f'{sig_tor:~P}')

    # Mask velocities to below 10 km only
    mask = z <= 10*units.km

    # Custom colorscale for the wind profile
    intervals = np.array([0, 1, 3, 5, 10]) * units.km
    colors = ['tab:red', 'tab:green', 'tab:blue', 'tab:olive']

    # Create a hodograph
    ax1 = ax.add_subplot(gs[0,-1])
    h = Hodograph(ax1, component_range=40.)
    h.add_grid(increment=5)
    u1 = u.to(units('m/s'))
    v1 = v.to(units('m/s'))
    h.plot_colormapped(u1[mask], v1[mask], z[mask], intervals=intervals, colors=colors)

    return skew
Souda
  • 63
  • 4

1 Answers1

0

metpy.calc.significant_tornado is converting scalar values to single-value ndarrays and returning those, so that you are printing an ndarray string with its brackets. You should be able to update your text string line to plt.figtext( 0.8, 0.30, f'{sig_tor[0]:~P}') to print the value alone here, currently.

dcamron
  • 155
  • 5