Source code for slitflow.fig.trajectory

import numpy as np
import matplotlib.pyplot as plt

from .style import Basic
from .figure import Figure, inherit_split_depth
from ..fun.misc import reduce_list as rl


[docs] class All(Figure): """Show all trajectories of each image. Args: reqs[0] (Table): X,Y-coordinate of trajectories. Required param; ``length_unit``. param["trj_depth"] (int): Column depth of trajectory number. param["centered"] (bool, optional): If True, the centroid position from all trajectory positions is set as (0, 0). Returns: Figure: Trajectory Figure object """
[docs] def set_info(self, param={}): """Copy and modify info from reqs[0] and add params. """ self.info.copy_req(0) inherit_split_depth(self, 0, param["trj_depth"]) length_unit = self.info.get_param_value("length_unit") self.info.add_param( "calc_cols", ["x_" + length_unit, "y_" + length_unit], "list of str", "X,Y-coordinate columns") if ("centered", True) in param.items(): self.info.add_param( "centered", param["centered"], "bool", "Whether to set the centroid of positions to zero")
[docs] @staticmethod def process(reqs, param): """Show all trajectories of each image. Args: reqs[0] (pandas.DataFrame): X,Y-coordinate of trajectories. param["calc_cols"] (list of str): Column names for X and Y axes. param["index_cols"] (list of str): Column names of index. This column is used for :meth:`pandas.DataFrame.groupby`. param["centered"] (bool, optional): If True, the centroid position from all trajectory positions is set as (0, 0). Returns: matplotlib.figure.Figure: matplotlib Figure containing trajectory plot """ df = reqs[0].copy() if ("centered", True) in param.items(): xc = (np.max(df[param["calc_cols"][0]].values) + np.min(df[param["calc_cols"][0]].values)) / 2 yc = (np.max(df[param["calc_cols"][1]].values) + np.min(df[param["calc_cols"][1]].values)) / 2 else: xc = 0 yc = 0 fig, ax = plt.subplots() for i, (_, df_trj) in enumerate(df.groupby(rl(param["index_cols"]))): ax.plot(df_trj[param["calc_cols"][0]].values - xc, df_trj[param["calc_cols"][1]].values - yc, label="line" + str(i + 1)) return fig
[docs] class StyleAll(Basic): """Simplified styling class for trajectory Figure. Args: reqs[0] (Figure): Trajectory Figure. param["half_width"] (float, optional): Half width of rendering axes in ``length_unit``. Used if trajectory is centered. Returns: Figure: Styled Figure object """
[docs] def set_info(self, param={}): """Set default param then run super().set_info. """ if "size" not in param: param["size"] = [4, 4] if "margin" not in param: param["margin"] = [0, 0, 0, 0] if "line_widths" not in param: param["line_widths"] = [0.2] if "line_colors" not in param: param["line_colors"] = [[0, 0, 0]] if "is_box" not in param: param["is_box"] = False req_param = self.reqs[0].info.get_param_dict() if ("centered", True) in req_param.items(): if "half_width" in param: hw = param["half_width"] param["limit"] = [-hw, hw, -hw, hw] else: param["limit"] = [-10, 10, -10, 10] elif ("img_size" in req_param) & ("pitch" in req_param): # set limit to image edges param["limit"] = [0, req_param["img_size"][0] * req_param["pitch"], 0, req_param["img_size"][1] * req_param["pitch"]] if "limit" in param: # to remove tick line param["tick"] = [ [param["limit"][0] - 1, param["limit"][1] + 1], [param["limit"][2] - 1, param["limit"][3] + 1]] super().set_info(param)