def plot(self, f, lfilter=None, plot_xy=False, **kargs): # type: (Callable, Optional[Callable], bool, Any) -> Line2D """Applies a function to each packet to get a value that will be plotted with matplotlib. A list of matplotlib.lines.Line2D is returned. lfilter: a truth function that decides whether a packet must be plotted """ # Python 2 backward compatibility f = lambda_tuple_converter(f) lfilter = lambda_tuple_converter(lfilter) # Get the list of packets if lfilter is None: lst_pkts = [f(*e) for e in self.res] else: lst_pkts = [f(*e) for e in self.res if lfilter(*e)] # Mimic the default gnuplot output if kargs == {}: kargs = MATPLOTLIB_DEFAULT_PLOT_KARGS if plot_xy: lines = plt.plot(*zip(*lst_pkts), **kargs) else: lines = plt.plot(lst_pkts, **kargs) # Call show() if matplotlib is not inlined if not MATPLOTLIB_INLINED: plt.show() return lines
def filter(self, func): # type: (Callable) -> PacketList """Returns a packet list filtered by a truth function. This truth function has to take a packet as the only argument and return a boolean value.""" # noqa: E501 # Python 2 backward compatibility func = lambda_tuple_converter(func) return self.__class__([x for x in self.res if func(*x)], name="filtered %s" % self.listname)
def multiplot(self, f, lfilter=None, plot_xy=False, **kargs): # type: (Callable, Optional[Callable], bool, Any) -> Line2D """Uses a function that returns a label and a value for this label, then plots all the values label by label. A list of matplotlib.lines.Line2D is returned. """ # Python 2 backward compatibility f = lambda_tuple_converter(f) lfilter = lambda_tuple_converter(lfilter) # Get the list of packets if lfilter is None: lst_pkts = (f(*e) for e in self.res) else: lst_pkts = (f(*e) for e in self.res if lfilter(*e)) # Apply the function f to the packets d = {} # type: Dict[str, List[float]] for k, v in lst_pkts: d.setdefault(k, []).append(v) # Mimic the default gnuplot output if not kargs: kargs = MATPLOTLIB_DEFAULT_PLOT_KARGS if plot_xy: lines = [ plt.plot(*zip(*pl), **dict(kargs, label=k)) for k, pl in six.iteritems(d) ] else: lines = [ plt.plot(pl, **dict(kargs, label=k)) for k, pl in six.iteritems(d) ] plt.legend(loc="center right", bbox_to_anchor=(1.5, 0.5)) # Call show() if matplotlib is not inlined if not MATPLOTLIB_INLINED: plt.show() return lines
def summary(self, prn=None, lfilter=None): # type: (Optional[Callable], Optional[Callable]) -> None """prints a summary of each packet :param prn: function to apply to each packet instead of lambda x:x.summary() :param lfilter: truth function to apply to each packet to decide whether it will be displayed """ # Python 2 backward compatibility prn = lambda_tuple_converter(prn) lfilter = lambda_tuple_converter(lfilter) for r in self.res: if lfilter is not None: if not lfilter(*r): continue if prn is None: print(self._elt2sum(r)) else: print(prn(*r))
def nsummary(self, prn=None, lfilter=None): # type: (Optional[Callable], Optional[Callable]) -> None """prints a summary of each packet with the packet's number :param prn: function to apply to each packet instead of lambda x:x.summary() :param lfilter: truth function to apply to each packet to decide whether it will be displayed """ # Python 2 backward compatibility prn = lambda_tuple_converter(prn) lfilter = lambda_tuple_converter(lfilter) for i, res in enumerate(self.res): if lfilter is not None: if not lfilter(*res): continue print(conf.color_theme.id(i, fmt="%04i"), end=' ') if prn is None: print(self._elt2sum(res)) else: print(prn(*res))