Plotting ======== Interactive 3D Plots -------------------- The easiest method of plotting 3D PEPT-like data is using the ``pept.plots.PlotlyGrapher`` interactive grapher: :: # Plotting some example 3D lines import pept from pept.plots import PlotlyGrapher import numpy as np lines_raw = np.arange(70).reshape((10, 7)) lines = pept.LineData(lines_raw) PlotlyGrapher().add_lines(lines).show() :: # Plotting some example 3D points import pept from pept.plots import PlotlyGrapher import numpy as np points_raw = np.arange(40).reshape((10, 4)) points = pept.PointData(points_raw) PlotlyGrapher().add_points(points).show() The ``PlotlyGrapher`` object allows straightforward subplots creation: :: # Plot the example 3D lines and points on separate subplots grapher = PlotlyGrapher(cols = 2) grapher.add_lines(lines) # col = 1 by default grapher.add_points(points, col = 2) grapher.show() :: # Plot the example 3D lines and points on separate subplots grapher = PlotlyGrapher(rows = 2, cols = 2) grapher.add_lines(lines, col = 2) # row = 1 by default grapher.add_points(points, row = 2, col = 2) grapher.show() Adding Colourbars ----------------- By default, the last column of a dataset is used to colour-code the resulting points: :: from pept.plots import PlotlyGrapher PlotlyGrapher().add_points(point_data).show() # Colour-codes by the last column You can change the column used to colour-code points using a numeric index (e.g. first column ``colorbar_col = 0``, second to last column ``colorbar_col = -2``) or named column (e.g. ``colorbar_col = "error"``): :: PlotlyGrapher().add_points(point_data, colorbar_col = -2).show() PlotlyGrapher().add_points(point_data, colorbar_col = "label").show() # Coloured by trajectory PlotlyGrapher().add_points(point_data, colorbar_col = "v").show() # Coloured by velocity As a ``PlotlyGrapher`` will often manage multiple subplots, one shouldn't include explicit colourbars on the sides *for each dataset plotted*. Therefore, colourbars are hidden by default; add a colourbar by setting its title: :: PlotlyGrapher().add_points(points, colorbar_title = "Velocity").show() Histogram of Tracking Errors ---------------------------- The ``Centroids(error = True)`` filter appends a column "error" representing the relative error in the tracked position. You can select a named column via indexing, e.g. ``trajectories["error"]``; you can then plot a histogram of the relative errors with: :: import plotly.express as px px.histogram(trajectories["error"]).show() # Large values are noise px.histogram(trajectories["cluster_size"]).show() # Small values are noise It is often useful to remove points with an error higher than a certain value, e.g. 20 mm: :: trajectories = Condition("error < 20").fit(trajectories) # Or simply append the `Condition` to the `pept.Pipeline` pipeline = pept.Pipeline([ ... Condition("cluster_size > 30, error < 20"), ... ]) Exporting Plotly Graphs as Images --------------------------------- The standard output of the Plotly grapher is an interactive HTML webpage; however, this can lead to large file sizes or memory overflows. Plotly allows for graphs to be exported as images to alleviate some of these issues. Ensure you have imported: :: import plotly.express as px import kaleido import plotly.io as pio There are two main ways of exporting as images: :: # Save the inner plotly.Figure attribute of a `grapher` # Format can be changed to other image formats # Width and height can be adjusted to give the desired image size grapher.fig.write_image("figure.png", width=2560, height=1440) Modifying the Underlying Figure ------------------------------- You can access the Plotly figure wrapped and managed by a PlotlyGrapher using the ``.fig`` attribute: :: grapher.fig.update_layout(xaxis_title = "Pipe Length (mm)")