def kde(self, x, y, data=None): data, x, y = self._process_args(data, x, y) opts = dict(plot=self._plot_opts, style=self._style_opts, norm=self._norm_opts) opts = { 'Distribution': opts, 'Area': opts, 'NdOverlay': { 'plot': dict(self._plot_opts, legend_limit=0) } } if not isinstance(y, (list, tuple)): ranges = {y: self._dim_ranges['x']} if self.by: dists = Dataset(data).to(Distribution, y, [], self.by) dists = dists.layout() if self.subplots else dists.overlay() else: dists = Distribution(data, y, []) else: ranges = {self.value_label: self._dim_ranges['x']} data = data[y] df = pd.melt(data, var_name=self.group_label, value_name=self.value_label) ds = Dataset(df) if len(df): dists = ds.to(Distribution, self.value_label).overlay() else: vdim = self.value_label + ' Density' dists = NdOverlay({0: Area([], self.value_label, vdim)}, [self.group_label]) return dists.redim(**self._redim).redim.range(**ranges).relabel( **self._relabel).opts(opts)
def single_chart(self, element, x, y, data=None): labelled = ['y' if self.invert else 'x'] if x != 'index' else [] if not self.is_series: labelled.append('x' if self.invert else 'y') elif not self.label: self._relabel['label'] = y opts = { element.__name__: dict(plot=dict(self._plot_opts, labelled=labelled), norm=self._norm_opts, style=self._style_opts) } ranges = {y: self._dim_ranges['y']} if x: ranges[x] = self._dim_ranges['x'] data = self.data if data is None else data ys = [y] for p in 'cs': if p in self.kwds and self.kwds[p] in data.columns: ys += [self.kwds[p]] if self.by: chart = Dataset(data, self.by + [x], ys).to(element, x, ys, self.by).relabel(**self._relabel) chart = chart.layout() if self.subplots else chart.overlay( ).options(batched=False) else: chart = element(data, x, ys).relabel(**self._relabel) return chart.redim.range(**ranges).redim(**self._redim).opts(opts)