Source code for pyspedas.particles.spd_slice2d.slice1d_plot

import logging
import numpy as np
import matplotlib.pyplot as plt
from .slice2d_getinfo import slice2d_getinfo
from pyspedas.particles.spd_units_string import spd_units_string


[docs] def slice1d_plot(the_slice, direction, value, xrange=None, yrange=None): """ Create 1D plot from a 2D particle slice. If the 'value' argument is a scalar, this plots a cut through the distribution at the nearest point in the specified direction If the 'value' argument is a two-element list, this sums over the values between the min and max of the list Parameters ---------- the_slice: dict 2D slice returned by slice2d direction: str Axis to plot - 'x' or 'y' value: float or list of float If direction is 'x', this is the y-value to create a 1D plot at (and vice versa) can also be a range of values, e.g., [-1000, 1000] to sum over the y-values from -1000 to +1000 """ direction = direction.lower() if direction not in ['x', 'y']: logging.error('Invalid direction specified. Valid options are: x, y') return if xrange is None: if direction == 'x': xrange = [np.nanmin(the_slice['ygrid']), np.nanmax(the_slice['ygrid'])] elif direction == 'y': xrange = [np.nanmin(the_slice['xgrid']), np.nanmax(the_slice['xgrid'])] fig = plt.figure() axis = fig.add_subplot(111) fig.subplots_adjust(left=0.14, right=0.94, top=0.90, bottom=0.14) # get annotations annotations = slice2d_getinfo(the_slice) xunits = the_slice['xyunits'] if the_slice['energy']: xtitle = 'E (' + xunits + ')' else: if direction == 'x': xtitle = annotations['xtitle'] else: xtitle = annotations['ytitle'] options = {'linewidth': 0.5, 'color': 'black'} axis.set_xlabel(xtitle) axis.set_ylabel(annotations['ztitle']) axis.set_yscale('log') if isinstance(value, list): # sum over a range specified by value if direction == 'x': values_to_incl = np.argwhere((the_slice['ygrid'] >= value[0]) & (the_slice['ygrid'] <= value[1])).flatten() if len(values_to_incl) != 0: axis.plot(the_slice['xgrid'], np.nansum(the_slice['data'][:, values_to_incl], axis=1), **options) elif direction == 'y': values_to_incl = np.argwhere((the_slice['xgrid'] >= value[0]) & (the_slice['xgrid'] <= value[1])).flatten() if len(values_to_incl) != 0: axis.plot(the_slice['ygrid'], np.nansum(the_slice['data'][values_to_incl, :], axis=0), **options) plt.show() return # single point if direction == 'x': closest_at_this_value = the_slice['ygrid'].flat[np.abs(the_slice['ygrid'] - value).argmin()] idx_at_this_value = np.argwhere(the_slice['ygrid'] == closest_at_this_value).flatten() axis.plot(the_slice['ygrid'], the_slice['data'][:, idx_at_this_value].flatten(), **options) elif direction == 'y': closest_at_this_value = the_slice['xgrid'].flat[np.abs(the_slice['xgrid'] - value).argmin()] idx_at_this_value = np.argwhere(the_slice['xgrid'] == closest_at_this_value).flatten() axis.plot(the_slice['xgrid'], the_slice['data'][idx_at_this_value, :].flatten(), **options) fig.show() return
# For backward compatibility with PyHC Summer School 2024 notebooks plot = slice1d_plot