blob: 7f96594e0500d157b11445e2c8db1005a6a59168 [file] [log] [blame]
# 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)