| # Copyright 2015-2017 ARM Limited |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| """ |
| This class sublclasses :mod:`trappy.plotter.StaticPlot.StaticPlot` to |
| implement a line plot. |
| """ |
| |
| from trappy.plotter import AttrConf |
| from trappy.plotter.StaticPlot import StaticPlot |
| |
| class LinePlot(StaticPlot): |
| """ |
| This class uses :mod:`trappy.plotter.Constraint.Constraint` to |
| represent different permutations of input parameters. These |
| constraints are generated by creating an instance of |
| :mod:`trappy.plotter.Constraint.ConstraintManager`. |
| |
| :param traces: The input data |
| :type traces: a list of :mod:`trappy.trace.FTrace`, |
| :mod:`trappy.trace.SysTrace`, :mod:`trappy.trace.BareTrace` |
| or :mod:`pandas.DataFrame` or a single instance of them. |
| |
| :param column: specifies the name of the column to |
| be plotted. |
| :type column: (str, list(str)) |
| |
| :param templates: TRAPpy events |
| |
| .. note:: |
| |
| This is not required if a :mod:`pandas.DataFrame` is |
| used |
| |
| :type templates: :mod:`trappy.base.Base` |
| |
| :param filters: Filter the column to be plotted as per the |
| specified criteria. For Example: |
| :: |
| |
| filters = |
| { |
| "pid": [ 3338 ], |
| "cpu": [0, 2, 4], |
| } |
| :type filters: dict |
| |
| :param per_line: Used to control the number of graphs |
| in each graph subplot row |
| :type per_line: int |
| |
| :param concat: Draw all the pivots on a single graph |
| :type concat: bool |
| |
| :param fill: Fill the area under the plots |
| :type fill: bool |
| |
| :param permute: Draw one plot for each of the traces specified |
| :type permute: bool |
| |
| :param drawstyle: This argument is forwarded to the matplotlib |
| corresponding :func:`matplotlib.pyplot.plot` call |
| |
| drawing style. |
| |
| .. note:: |
| |
| step plots are not currently supported for filled |
| graphs |
| |
| :param xlim: A tuple representing the upper and lower xlimits |
| :type xlim: tuple |
| |
| :param ylim: A tuple representing the upper and lower ylimits |
| :type ylim: tuple |
| |
| :param title: A title describing all the generated plots |
| :type title: str |
| |
| :param style: Created pre-styled graphs loaded from |
| :mod:`trappy.plotter.AttrConf.MPL_STYLE` |
| :type style: bool |
| |
| :param signals: A string of the type event_name:column to indicate |
| the value that needs to be plotted. You can add an additional |
| parameter to specify the color of the lin in rgb: |
| "event_name:column:color". The color is specified as a comma |
| separated list of rgb values, from 0 to 255 or from 0x0 to |
| 0xff. E.g. 0xff,0x0,0x0 is red and 100,40,32 is brown. |
| |
| .. note:: |
| |
| - Only one of `signals` or both `templates` and |
| `columns` should be specified |
| - Signals format won't work for :mod:`pandas.DataFrame` |
| input |
| |
| :type signals: str |
| |
| """ |
| |
| def __init__(self, traces, templates=None, **kwargs): |
| # Default keys, each can be overridden in kwargs |
| |
| super(LinePlot, self).__init__( |
| traces=traces, |
| templates=templates, |
| **kwargs) |
| |
| self._check_add_scatter() |
| |
| def set_defaults(self): |
| """Sets the default attrs""" |
| super(LinePlot, self).set_defaults() |
| self._attr["scatter"] = AttrConf.PLOT_SCATTER |
| self._attr["fill"] = AttrConf.FILL |
| |
| def _check_add_scatter(self): |
| """Check if a scatter plot is needed |
| and augment the forwarded args accordingly""" |
| |
| if self._attr["scatter"]: |
| self._attr["args_to_forward"]["linestyle"] = "" |
| self._attr["args_to_forward"]["marker"] = "o" |
| if "point_size" in self._attr: |
| self._attr["args_to_forward"]["markersize"] = \ |
| self._attr["point_size"] |
| |
| def fill_line(self, axis, line_2d, cmap_index): |
| """Fill the area under a line""" |
| drawstyle = line_2d.get_drawstyle() |
| if drawstyle.startswith("steps"): |
| # This has been fixed in upstream matplotlib |
| raise UserWarning("matplotlib does not support fill for step plots") |
| |
| xdat, ydat = line_2d.get_data(orig=False) |
| axis.fill_between( |
| xdat, |
| axis.get_ylim()[0], |
| ydat, |
| facecolor=self._cmap.cmap(cmap_index), |
| alpha=AttrConf.ALPHA) |
| |
| def plot_axis(self, axis, series_list, permute, concat, args_to_forward): |
| """Internal Method called to plot data (series_list) on a given axis""" |
| for i, (constraint, pivot) in enumerate(series_list): |
| result = constraint.result |
| line_2d_list = axis.plot( |
| result[pivot].index, |
| result[pivot].values, |
| color=self._cmap.cmap(i), |
| **args_to_forward |
| ) |
| |
| if self._attr["fill"]: |
| self.fill_line(axis, line_2d_list[0], i) |
| |
| axis.set_title(self.make_title(constraint, pivot, permute, concat)) |
| |
| self.add_to_legend(i, line_2d_list[0], constraint, pivot, concat, permute) |