def plot_coordinate_systems( cs_data: Tuple[str, Dict], axes: plt.Axes.axes = None, title: str = None, limits: Union[List[Tuple[float, float]], Tuple[float, float]] = None, time_index: int = None, legend_pos: str = "lower left", ) -> plt.Axes.axes: """Plot multiple coordinate systems. Parameters ---------- cs_data : Tuple[str, Dict] A tuple containing the coordinate system that should be plotted and a dictionary with the key word arguments that should be passed to its plot function. axes : matplotlib.axes.Axes The target axes object that should be drawn to. If `None` is provided, a new one will be created. title : str The title of the plot limits : Tuple[float, float] or List[Tuple[float, float]] Each tuple marks lower and upper boundary of the x, y and z axis. If only a single tuple is passed, the boundaries are used for all axis. If `None` is provided, the axis are adjusted to be of equal length. time_index : int Index of a specific time step that should be plotted if the corresponding coordinate system is time dependent legend_pos : str A string that specifies the position of the legend. See the matplotlib documentation for further details Returns ------- matplotlib.axes.Axes : The axes object that was used as canvas for the plot """ if axes is None: _, axes = new_3d_figure_and_axes() for lcs, kwargs in cs_data: if "time_index" not in kwargs: kwargs["time_index"] = time_index lcs.plot(axes, **kwargs) _set_limits_matplotlib(axes, limits) if title is not None: axes.set_title(title) axes.legend(loc=legend_pos) return axes
def plot_coordinate_system_manager_matplotlib( csm, axes: plt.Axes.axes = None, reference_system: str = None, coordinate_systems: List[str] = None, data_sets: List[str] = None, colors: Dict[str, int] = None, time: Union[pd.DatetimeIndex, pd.TimedeltaIndex, List[pd.Timestamp]] = None, time_ref: pd.Timestamp = None, title: str = None, limits: Union[List[Tuple[float, float]], Tuple[float, float]] = None, show_origins: bool = True, show_trace: bool = True, show_vectors: bool = True, ) -> plt.Axes.axes: """Plot the coordinate systems of a `weldx.transformations.CoordinateSystemManager`. Parameters ---------- csm : weldx.transformations.CoordinateSystemManager The `weldx.transformations.CoordinateSystemManager` that should be plotted axes : matplotlib.axes.Axes The target axes object that should be drawn to. If `None` is provided, a new one will be created. reference_system : str The name of the reference system for the plotted coordinate systems coordinate_systems : List[str] Names of the coordinate systems that should be drawn. If `None` is provided, all systems are plotted. data_sets : List[str] Names of the data sets that should be drawn. If `None` is provided, all data is plotted. colors: Dict[str, int] A mapping between a coordinate system name or a data set name and a color. The colors must be provided as 24 bit integer values that are divided into three 8 bit sections for the rgb values. For example `0xFF0000` for pure red. Each coordinate system or data set that does not have a mapping in this dictionary will get a default color assigned to it. time : pandas.DatetimeIndex, pandas.TimedeltaIndex, List[pandas.Timestamp], or \ weldx.transformations.LocalCoordinateSystem The time steps that should be plotted time_ref : pandas.Timestamp A reference timestamp that can be provided if the ``time`` parameter is a `pandas.TimedeltaIndex` title : str The title of the plot limits : Tuple[float, float] or List[Tuple[float, float]] Each tuple marks lower and upper boundary of the x, y and z axis. If only a single tuple is passed, the boundaries are used for all axis. If `None` is provided, the axis are adjusted to be of equal length. show_origins : bool If `True`, the origins of the coordinate system are visualized in the color assigned to the coordinate system. show_trace : bool If `True`, the trace of time dependent coordinate systems is plotted. show_vectors : bool If `True`, the coordinate cross of time dependent coordinate systems is plotted. Returns ------- matplotlib.axes.Axes : The axes object that was used as canvas for the plot """ if time is not None: return plot_coordinate_system_manager_matplotlib( csm.interp_time(time=time, time_ref=time_ref), axes=axes, reference_system=reference_system, coordinate_systems=coordinate_systems, title=title, show_origins=show_origins, show_trace=show_trace, show_vectors=show_vectors, ) if axes is None: _, axes = new_3d_figure_and_axes() axes.set_xlabel("x") axes.set_ylabel("y") axes.set_zlabel("z") if reference_system is None: reference_system = csm.root_system_name if coordinate_systems is None: coordinate_systems = csm.coordinate_system_names if data_sets is None: data_sets = csm.data_names if title is not None: axes.set_title(title) # plot coordinate systems color_gen = _color_generator_function() for lcs_name in coordinate_systems: color = _color_int_to_rgb_normalized( _get_color(lcs_name, colors, color_gen)) lcs = csm.get_cs(lcs_name, reference_system) lcs.plot( axes=axes, color=color, label=lcs_name, show_origin=show_origins, show_trace=show_trace, show_vectors=show_vectors, ) # plot data for data_name in data_sets: color = _color_int_to_rgb_normalized( _get_color(data_name, colors, color_gen)) data = csm.get_data(data_name, reference_system) triangles = None if isinstance(data, geo.SpatialData): triangles = data.triangles data = data.coordinates data = data.data while data.ndim > 2: data = data[0] axes.plot(data[:, 0], data[:, 1], data[:, 2], "x", color=color, label=data_name) if triangles is not None: for triangle in triangles: triangle_data = data[[*triangle, triangle[0]], :] axes.plot( triangle_data[:, 0], triangle_data[:, 1], triangle_data[:, 2], color=color, ) _set_limits_matplotlib(axes, limits) axes.legend() return axes