Source code for pyleecan.Functions.Plot.plot_A_space

# -*- coding: utf-8 -*-

from ..init_fig import init_fig
from .plot_A_2D import plot_A_2D
from ...definitions import config_dict
from numpy import squeeze, split, max as np_max
from itertools import repeat


[docs]def plot_A_space( data, index_list=[0], t=None, t_index=0, is_deg=True, is_fft=False, is_spaceorder=False, r_max=100, fund_harm=None, is_norm=False, unit="SI", data_list=[], legend_list=[], color_list=[], linestyle_list=[], save_path=None, y_min=None, y_max=None, mag_max=None, is_auto_ticks=True, fig=None, subplot_index=None, ): """Plots a field as a function of space (angle) Parameters ---------- data : Data a Data object index_list : list list of indices to take from a components axis t : float time value at which to slice t_index : int time index at which to slice is_deg : bool boolean indicating if the angle must be converted to degrees is_fft : bool boolean indicating if we want to plot the space-fft below the plot is_spaceorder : bool boolean indicating if we want to use the spatial order for the fft axis r_max : int maximum value of the wavenumber for the fft axis fund_harm : float frequency of the fundamental harmonic is_norm : bool boolean indicating if the field must be normalized unit : str unit in which to plot the field data_list : list list of Data objects to compare legend_list : list list of legends to use for each Data object (including reference one) instead of data.name color_list : list list of colors to use for each Data object save_path : str path and name of the png file to save y_min : float minimum value for the y-axis y_max : float maximum value for the y-axis mag_max : float maximum alue for the y-axis of the fft is_auto_ticks : bool in fft, adjust ticks to wavenumbers (deactivate if too close) fig : Matplotlib.figure.Figure existing figure to use if None create a new one """ # Set plot is_show_fig = True if fig is None else False (fig, axes, patch_leg, label_leg) = init_fig(fig, shape="rectangle") data_list2 = [data] + data_list if legend_list == []: legend_list = [d.name for d in data_list2] curve_colors = config_dict["PLOT"]["COLOR_DICT"]["CURVE_COLORS"] phase_colors = config_dict["PLOT"]["COLOR_DICT"]["PHASE_COLORS"] legends = [] colors = [] linestyles = [] n_phase = len(index_list) list_str = None for i, d in enumerate(data_list2): is_components = False for axis in d.axes: try: if axis.is_components: is_components = True legends += [ legend_list[i] + ": " + axis.values.tolist()[j] for j in index_list ] colors += [phase_colors[i * n_phase + j] for j in range(n_phase)] linestyles += list(repeat("-", n_phase)) list_str = axis.name except: is_components = False if not is_components: legends.append(legend_list[i]) colors.append(curve_colors[i]) linestyles.append("-") if color_list == []: color_list = colors if linestyle_list == []: linestyle_list = linestyles if unit == "SI": unit = data.unit if is_norm: ylabel = r"$\frac{" + data.symbol + "}{" + data.symbol + "_0}\, [" + unit + "]$" else: ylabel = r"$" + data.symbol + "\, [" + unit + "]$" # Prepare the extractions if is_deg: a_str = "angle{°}" xlabel = "Angle [°]" else: a_str = "angle" xlabel = "Angle [rad]" if t != None: t_str = "time=" + str(t) else: t_str = "time[" + str(t_index) + "]" if data_list == []: title = data.name + " over space at " + t_str else: title = "Comparison of " + data.name + " over space at " + t_str # Extract the fields if list_str is not None: results = data.compare_along( a_str, t_str, list_str + str(index_list), data_list=data_list, unit=unit, is_norm=is_norm, ) else: results = data.compare_along( a_str, t_str, data_list=data_list, unit=unit, is_norm=is_norm ) angle = results["angle"] if is_deg and round(np_max(angle) / 6) % 5 == 0: xticks = [i * round(np_max(angle) / 6) for i in range(7)] else: xticks = None Ydatas = [results[data.symbol]] + [ results[d.symbol + "_" + str(i)] for i, d in enumerate(data_list) ] Ydata = [] for d in Ydatas: if d.ndim != 1: Ydata += split(d, len(index_list)) else: Ydata += [d] Ydata = [squeeze(d) for d in Ydata] # Plot the original graph ax = plot_A_2D( angle, Ydata, legend_list=legends, color_list=color_list, linestyle_list=linestyle_list, fig=fig, title=title, xlabel=xlabel, ylabel=ylabel, y_min=y_min, y_max=y_max, xticks=xticks, save_path=save_path, subplot_index=subplot_index, ) if is_fft: if "dB" in unit: unit_str = ( "[" + unit + " re. " + str(data.normalizations["ref"]) + data.unit + "]" ) else: unit_str = "[" + unit + "]" if data_list == []: title = "FFT of " + data.name else: title = "Comparison of " + data.name + " FFT" if data.symbol == "Magnitude": ylabel = "Magnitude " + unit_str else: ylabel = r"$|\widehat{" + data.symbol + "}|$ " + unit_str legend_list = [legend_list[0]] + [legend_list[-1]] if is_spaceorder: order_max = r_max / data.normalizations.get("space_order") xlabel = "Space order []" results = data.compare_magnitude_along( "wavenumber=[0," + str(order_max) + "]{space_order}", t_str, data_list=data_list, unit=unit, is_norm=False, ) else: xlabel = "Wavenumber []" results = data.compare_magnitude_along( "wavenumber=[0," + str(r_max) + "]", t_str, data_list=data_list, unit=unit, is_norm=False, ) wavenumber = results["wavenumber"] Ydata = [results[data.symbol]] + [ results[d.symbol + "_" + str(i)] for i, d in enumerate(data_list) ] if is_auto_ticks: indices = [0] for i in range(len(Ydata)): indices += list( set([ind for ind, y in enumerate(Ydata[i]) if abs(y) > 0.01]) ) xticks = wavenumber[indices] else: xticks = None plot_A_2D( wavenumber, Ydata, legend_list=legend_list, color_list=color_list, linestyle_list=linestyle_list, fig=fig, title=title, xlabel=xlabel, ylabel=ylabel, type="bargraph", is_fund=True, fund_harm=fund_harm, y_max=mag_max, xticks=xticks, save_path=save_path, ) if is_show_fig: fig.show() return ax