Home | History | Annotate | Download | only in plotter
      1 #    Copyright 2015-2017 ARM Limited
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #     http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 #
     15 
     16 """
     17 This class sublclasses :mod:`trappy.plotter.StaticPlot.StaticPlot` to
     18 implement a line plot.
     19 """
     20 
     21 from trappy.plotter import AttrConf
     22 from trappy.plotter.StaticPlot import StaticPlot
     23 
     24 class LinePlot(StaticPlot):
     25     """
     26     This class uses :mod:`trappy.plotter.Constraint.Constraint` to
     27     represent different permutations of input parameters. These
     28     constraints are generated by creating an instance of
     29     :mod:`trappy.plotter.Constraint.ConstraintManager`.
     30 
     31     :param traces: The input data
     32     :type traces: a list of :mod:`trappy.trace.FTrace`,
     33         :mod:`trappy.trace.SysTrace`, :mod:`trappy.trace.BareTrace`
     34         or :mod:`pandas.DataFrame` or a single instance of them.
     35 
     36     :param column: specifies the name of the column to
     37            be plotted.
     38     :type column: (str, list(str))
     39 
     40     :param templates: TRAPpy events
     41 
     42         .. note::
     43 
     44                 This is not required if a :mod:`pandas.DataFrame` is
     45                 used
     46 
     47     :type templates: :mod:`trappy.base.Base`
     48 
     49     :param filters: Filter the column to be plotted as per the
     50         specified criteria. For Example:
     51         ::
     52 
     53             filters =
     54                     {
     55                         "pid": [ 3338 ],
     56                         "cpu": [0, 2, 4],
     57                     }
     58     :type filters: dict
     59 
     60     :param per_line: Used to control the number of graphs
     61         in each graph subplot row
     62     :type per_line: int
     63 
     64     :param concat: Draw all the pivots on a single graph
     65     :type concat: bool
     66 
     67     :param fill: Fill the area under the plots
     68     :type fill: bool
     69 
     70     :param permute: Draw one plot for each of the traces specified
     71     :type permute: bool
     72 
     73     :param drawstyle: This argument is forwarded to the matplotlib
     74         corresponding :func:`matplotlib.pyplot.plot` call
     75 
     76         drawing style.
     77 
     78         .. note::
     79 
     80             step plots are not currently supported for filled
     81             graphs
     82 
     83     :param xlim: A tuple representing the upper and lower xlimits
     84     :type xlim: tuple
     85 
     86     :param ylim: A tuple representing the upper and lower ylimits
     87     :type ylim: tuple
     88 
     89     :param title: A title describing all the generated plots
     90     :type title: str
     91 
     92     :param style: Created pre-styled graphs loaded from
     93         :mod:`trappy.plotter.AttrConf.MPL_STYLE`
     94     :type style: bool
     95 
     96     :param signals: A string of the type event_name:column to indicate
     97         the value that needs to be plotted.  You can add an additional
     98         parameter to specify the color of the lin in rgb:
     99         "event_name:column:color".  The color is specified as a comma
    100         separated list of rgb values, from 0 to 255 or from 0x0 to
    101         0xff.  E.g. 0xff,0x0,0x0 is red and 100,40,32 is brown.
    102 
    103         .. note::
    104 
    105             - Only one of `signals` or both `templates` and
    106               `columns` should be specified
    107             - Signals format won't work for :mod:`pandas.DataFrame`
    108               input
    109 
    110     :type signals: str
    111 
    112     """
    113 
    114     def __init__(self, traces, templates=None, **kwargs):
    115         # Default keys, each can be overridden in kwargs
    116 
    117         super(LinePlot, self).__init__(
    118             traces=traces,
    119             templates=templates,
    120             **kwargs)
    121 
    122         self._check_add_scatter()
    123 
    124     def set_defaults(self):
    125         """Sets the default attrs"""
    126         super(LinePlot, self).set_defaults()
    127         self._attr["scatter"] = AttrConf.PLOT_SCATTER
    128         self._attr["fill"] = AttrConf.FILL
    129 
    130     def _check_add_scatter(self):
    131         """Check if a scatter plot is needed
    132         and augment the forwarded args accordingly"""
    133 
    134         if self._attr["scatter"]:
    135             self._attr["args_to_forward"]["linestyle"] = ""
    136             self._attr["args_to_forward"]["marker"] = "o"
    137             if "point_size" in self._attr:
    138                 self._attr["args_to_forward"]["markersize"] = \
    139                     self._attr["point_size"]
    140 
    141     def fill_line(self, axis, line_2d, cmap_index):
    142         """Fill the area under a line"""
    143         drawstyle = line_2d.get_drawstyle()
    144         if drawstyle.startswith("steps"):
    145             # This has been fixed in upstream matplotlib
    146             raise UserWarning("matplotlib does not support fill for step plots")
    147 
    148         xdat, ydat = line_2d.get_data(orig=False)
    149         axis.fill_between(
    150             xdat,
    151             axis.get_ylim()[0],
    152             ydat,
    153             facecolor=self._cmap.cmap(cmap_index),
    154             alpha=AttrConf.ALPHA)
    155 
    156     def plot_axis(self, axis, series_list, permute, concat, args_to_forward):
    157         """Internal Method called to plot data (series_list) on a given axis"""
    158         for i, (constraint, pivot) in enumerate(series_list):
    159             result = constraint.result
    160             line_2d_list = axis.plot(
    161                 result[pivot].index,
    162                 result[pivot].values,
    163                 color=self._cmap.cmap(i),
    164                 **args_to_forward
    165             )
    166 
    167             if self._attr["fill"]:
    168                 self.fill_line(axis, line_2d_list[0], i)
    169 
    170             axis.set_title(self.make_title(constraint, pivot, permute, concat))
    171 
    172             self.add_to_legend(i, line_2d_list[0], constraint, pivot, concat, permute)
    173