# Copyright 2018 Regents of the University of Colorado. All Rights Reserved.
# Released under the MIT license.
# This software was developed at the University of Colorado's Laboratory for Atmospheric and Space Physics.
# Verify current version before use at: https://github.com/MAVENSDC/PyTplot
from pytplot import data_quants
import pytplot
import numpy as np
from pytplot import tplot_utilities as utilities
from copy import deepcopy
[docs]def options(name, option=None, value=None, opt_dict=None):
"""
This function allows the user to set a large variety of options for individual plots.
Parameters:
name : str
Name or number of the tplot variable
option : str
The name of the option. See section below.
value : str/int/float/list
The value of the option. See section below.
dict : dict
This can be a dictionary of option:value pairs. Option and value
will not be needed if this dictionary item is supplied.
Options:
=================== ========== =====
Options Value type Notes
=================== ========== =====
Color str/list red, green, blue, etc. Also takes in RGB tuples, i.e. (0,255,0) for green
Colormap str/list https://matplotlib.org/examples/color/colormaps_reference.html.
Spec int 1 sets the Tplot Variable to spectrogram mode, 0 reverts.
Alt int 1 sets the Tplot Variable to altitude plot mode, 0 reverts.
Map int 1 sets the Tplot Variable to latitude/longitude mode, 0 reverts.
link list Allows a user to reference one tplot variable to another.
ylog int 1 sets the y axis to log scale, 0 reverts.
zlog int 1 sets the z axis to log scale, 0 reverts (spectrograms only).
legend_names list A list of strings that will be used to identify the lines.
xlog_slice bool Sets x axis on slice plot to log scale if True.
ylog bool Set y axis on main plot window to log scale if True.
ylog_slice bool Sets y axis on slice plot to log scale if True.
zlog bool Sets z axis on main plot window to log scale if True.
line_style str scatter (to make scatter plots), or solid_line, dot, dash, dash_dot, dash_dot_dot_dot, long_dash.
char_size int Defines character size for plot labels, etc.
name str The title of the plot.
panel_size flt Number between (0,1], representing the percent size of the plot.
basemap str Full path and name of a background image for "Map" plots.
alpha flt Number between [0,1], gives the transparancy of the plot lines.
thick flt Sets plot line width.
yrange flt list Two numbers that give the y axis range of the plot.
zrange flt list Two numbers that give the z axis range of the plot.
xrange_slice flt list Two numbers that give the x axis range of spectrogram slicing plots.
yrange_slice flt list Two numbers that give the y axis range of spectrogram slicing plots.
ytitle str Title shown on the y axis.
ztitle str Title shown on the z axis. Spec plots only.
ysubtitle str Subtitle shown on the y axis.
zsubtitle str Subtitle shown on the z axis. Spec plots only.
plotter str Allows a user to implement their own plotting script in place of the ones
herein.
crosshair_x str Title for x-axis crosshair.
crosshair_y str Title for y-axis crosshair.
crosshair_z str Title for z-axis crosshair.
static str Datetime string that gives desired time to plot y and z values from a spec
plot.
static_tavg str Datetime string that gives desired time-averaged y and z values to plot
from a spec plot.
t_average int Seconds around which the cursor is averaged when hovering over spectrogram
plots.
'spec_plot_dim' int If variable two dimensions, this sets which dimension the variable will have on
on the y axis. All other dimensions are summed into this one.
=================== ========== =====
Returns:
None
Examples:
>>> # Change the y range of Variable1
>>> import pytplot
>>> x_data = [1,2,3,4,5]
>>> y_data = [1,2,3,4,5]
>>> pytplot.store_data("Variable1", data={'x':x_data, 'y':y_data})
>>> pytplot.options('Variable1', 'yrange', [2,4])
>>> # Change Variable1 to use a log scale
>>> pytplot.options('Variable1', 'ylog', 1)
"""
if isinstance(name, int):
name = list(pytplot.data_quants.keys())[name]
if opt_dict is None:
opt_dict = {option: value}
else:
if not isinstance(opt_dict,dict):
print("dict must be a dictionary object. Returning.")
return
if not isinstance(name, list):
name = [name]
for i in name:
for option, value in opt_dict.items():
# Lower case option for consistency
option = option.lower()
if i not in data_quants.keys():
print(str(i) + " is currently not in pytplot.")
return
if option == 'color':
if isinstance(value, list):
data_quants[i].attrs['plot_options']['extras']['line_color'] = value
else:
data_quants[i].attrs['plot_options']['extras']['line_color'] = [value]
if option == 'link':
if isinstance(value, list):
pytplot.link(i, value[1], value[0])
if option == 'colormap':
if isinstance(value, list):
data_quants[i].attrs['plot_options']['extras']['colormap'] = value
else:
data_quants[i].attrs['plot_options']['extras']['colormap'] = [value]
if option == 'spec':
_reset_plots(i)
if value:
if 'spec_bins' not in data_quants[i].coords:
print(f"{i} does not contain coordinates for spectrogram plotting. Continuing...")
else:
data_quants[i].attrs['plot_options']['extras']['spec'] = value
data_quants[i].attrs['plot_options']['yaxis_opt']['y_range'] = utilities.get_y_range(data_quants[i])
else:
data_quants[i].attrs['plot_options']['extras']['spec'] = value
data_quants[i].attrs['plot_options']['yaxis_opt']['y_range'] = utilities.get_y_range(data_quants[i])
if option == 'alt':
_reset_plots(i)
data_quants[i].attrs['plot_options']['extras']['alt'] = value
if option == 'map':
_reset_plots(i)
data_quants[i].attrs['plot_options']['extras']['map'] = value
if option == 'legend_names':
data_quants[i].attrs['plot_options']['yaxis_opt']['legend_names'] = value
if option == 'xlog_slice':
if value:
data_quants[i].attrs['plot_options']['slice_xaxis_opt']['xi_axis_type'] = 'log'
else:
data_quants[i].attrs['plot_options']['slice_xaxis_opt']['xi_axis_type'] = 'linear'
if option == 'ylog':
negflag = 0 # _ylog_check(data_quants, value, i)
if negflag == 0 and value:
data_quants[i].attrs['plot_options']['yaxis_opt']['y_axis_type'] = 'log'
else:
data_quants[i].attrs['plot_options']['yaxis_opt']['y_axis_type'] = 'linear'
if option == 'ylog_slice':
if value:
data_quants[i].attrs['plot_options']['slice_yaxis_opt']['yi_axis_type'] = 'log'
else:
data_quants[i].attrs['plot_options']['slice_yaxis_opt']['yi_axis_type'] = 'linear'
if option == 'zlog':
negflag = _zlog_check(data_quants, value, i)
if negflag == 0:
data_quants[i].attrs['plot_options']['zaxis_opt']['z_axis_type'] = 'log'
else:
data_quants[i].attrs['plot_options']['zaxis_opt']['z_axis_type'] = 'linear'
if option == 'nodata':
data_quants[i].attrs['plot_options']['line_opt']['visible'] = value
if option == 'line_style':
to_be = []
if value == 0 or value == 'solid_line':
to_be = []
elif value == 1 or value == 'dot':
to_be = [2, 4]
elif value == 2 or value == 'dash':
to_be = [6]
elif value == 3 or value == 'dash_dot':
to_be = [6, 4, 2, 4]
elif value == 4 or value == 'dash_dot_dot_dot':
to_be = [6, 4, 2, 4, 2, 4, 2, 4]
elif value == 5 or value == 'long_dash':
to_be = [10]
else:
to_be=value
data_quants[i].attrs['plot_options']['line_opt']['line_style'] = to_be
if(value == 6 or value == 'none'):
data_quants[i].attrs['plot_options']['line_opt']['visible'] = False
if option == 'char_size':
data_quants[i].attrs['plot_options']['extras']['char_size'] = value
if option == 'name':
data_quants[i].attrs['plot_options']['line_opt']['name'] = value
if option == "panel_size":
if value > 1 or value <= 0:
print("Invalid value. Should be (0, 1]")
return
data_quants[i].attrs['plot_options']['extras']['panel_size'] = value
if option == 'basemap':
data_quants[i].attrs['plot_options']['extras']['basemap'] = value
if option == 'alpha':
if value > 1 or value < 0:
print("Invalid value. Should be [0, 1]")
return
data_quants[i].attrs['plot_options']['extras']['alpha'] = value
if option == 'thick':
data_quants[i].attrs['plot_options']['line_opt']['line_width'] = value
if option == 'yrange' or option == 'y_range':
data_quants[i].attrs['plot_options']['yaxis_opt']['y_range'] = [value[0], value[1]]
if option == 'zrange' or option == 'z_range':
data_quants[i].attrs['plot_options']['zaxis_opt']['z_range'] = [value[0], value[1]]
if option == 'xrange_slice':
data_quants[i].attrs['plot_options']['slice_xaxis_opt']['xi_range'] = [value[0], value[1]]
if option == 'yrange_slice':
data_quants[i].attrs['plot_options']['slice_yaxis_opt']['yi_range'] = [value[0], value[1]]
if option == 'xtitle':
data_quants[i].attrs['plot_options']['xaxis_opt']['axis_label'] = value
if option == 'ytitle':
data_quants[i].attrs['plot_options']['yaxis_opt']['axis_label'] = value
if option == 'ztitle':
data_quants[i].attrs['plot_options']['zaxis_opt']['axis_label'] = value
if option == 'xsubtitle':
data_quants[i].attrs['plot_options']['xaxis_opt']['axis_subtitle'] = value
if option == 'ysubtitle':
data_quants[i].attrs['plot_options']['yaxis_opt']['axis_subtitle'] = value
if option == 'zsubtitle':
data_quants[i].attrs['plot_options']['zaxis_opt']['axis_subtitle'] = value
if option == 'ybar':
data_quants[i].attrs['plot_options']['extras']['ybar'] = value
if option == 'ybar_color':
data_quants[i].attrs['plot_options']['extras']['ybar'] = value
if option == 'ybar_size':
data_quants[i].attrs['plot_options']['extras']['ysize'] = value
if option == 'plotter':
_reset_plots(i)
data_quants[i].attrs['plot_options']['extras']['plotter'] = value
if option == 'crosshair_x':
data_quants[i].attrs['plot_options']['xaxis_opt']['crosshair'] = value
if option == 'crosshair_y':
data_quants[i].attrs['plot_options']['yaxis_opt']['crosshair'] = value
if option == 'crosshair_z':
data_quants[i].attrs['plot_options']['zaxis_opt']['crosshair'] = value
if option == 'static':
data_quants[i].attrs['plot_options']['extras']['static'] = value
if option == 'static_tavg':
data_quants[i].attrs['plot_options']['extras']['static_tavg'] = [value[0], value[1]]
if option == 't_average':
data_quants[i].attrs['plot_options']['extras']['t_average'] = value
if option == 'spec_plot_dim':
attr_dict = deepcopy(data_quants[i].attrs)
data_dict = {}
data_dict['x'] = data_quants[i].coords['time'].values
data_values = data_quants[i].values
if len(data_values.shape) <= 2:
pass
else:
data_dict['y'] = np.swapaxes(data_values, 2, value)
for c in data_quants[i].coords:
if c=='time' or c=='spec_bins':
continue
data_dict[c] = data_quants[i].coords[c].values
v2_values = data_quants[i].coords["v2"].values
data_dict['v2'] = data_dict['v'+str(value)]
data_dict['v' + str(value)] = v2_values
pytplot.store_data(i, data=data_dict)
data_quants[i].attrs = attr_dict
data_quants[i].attrs['plot_options']['yaxis_opt']['y_range'] = utilities.get_y_range(data_quants[i])
return
def _ylog_check(data_quants, value, i):
negflag = 0
namedata = data_quants[i]
# check variable data
# if negative numbers, don't allow log setting
datasets = [namedata]
for oplot_name in namedata.attrs['plot_options']['overplots']:
datasets.append(data_quants[oplot_name])
if value == 1:
for dataset in datasets:
if 'spec' not in dataset.attrs['plot_options']['extras']:
if dataset.min(skipna=True) < 0:
print('Negative data is incompatible with log plotting.')
negflag = 1
break
else:
if dataset.attrs['plot_options']['extras']['spec'] == 1:
if dataset.coords['spec_bins'].min(skipna=True) < 0:
print('Negative data is incompatible with log plotting.')
negflag = 1
break
elif value != 1:
# Using the 'negflag' as a way to not log something if the user doesn't want it to be logged
negflag = 1
return negflag
def _zlog_check(data_quants, value, i):
negflag = 0
namedata = data_quants[i]
# check variable data
# if negative numbers, don't allow log setting
datasets = [namedata]
for oplot_name in namedata.attrs['plot_options']['overplots']:
datasets.append(data_quants[oplot_name])
for dataset in datasets:
if value == 1:
if 'spec' in dataset.attrs['plot_options']['extras']:
if dataset.attrs['plot_options']['extras']['spec'] == 1:
if dataset.min(skipna=True) < 0:
print('Negative data is incompatible with log plotting.')
negflag = 1
break
elif value != 1:
# Using the 'negflag' as a way to not log something if the user doesn't want it to be logged
negflag = 1
return negflag
def _reset_plots(name):
data_quants[name].attrs['plot_options']['extras']['spec'] = 0
data_quants[name].attrs['plot_options']['extras']['alt'] = 0
data_quants[name].attrs['plot_options']['extras']['map'] = 0
data_quants[name].attrs['plot_options']['extras']['plotter'] = None