# Buggy code
def _kde_data(self, el, key, **kwargs):
    vdim = el.vdims[0]
    values = el.dimension_values(vdim)
    if self.clip:
        vdim = vdim(range=self.clip)
        el = el.clone(vdims=[vdim])
    kde = univariate_kde(el, dimension=vdim, **kwargs)
    xs, ys = (kde.dimension_values(i) for i in range(2))
    mask = isfinite(ys) & (ys > 0)  # Mask out non-finite and zero values
    xs, ys = xs[mask], ys[mask]
    ys = (ys / ys.max()) * (self.violin_width / 2.0) if len(ys) else []
    ys = [key + (sign * y,) for sign, vs in ((-1, ys), (1, ys[::-1])) for y in vs]
    xs = np.concatenate([xs, xs[::-1]])
    kde = {"ys": xs, "xs": ys}

    bars, segments, scatter = defaultdict(list), defaultdict(list), {}
    values = el.dimension_values(vdim)
    values = values[isfinite(values)]
    if not len(values):
        pass
    elif self.inner == "quartiles":
        for stat_fn in self._stat_fns:
            stat = stat_fn(values)
            sidx = np.argmin(np.abs(xs - stat))
            sx, sy = xs[sidx], ys[sidx]
            segments["x"].append(sx)
            segments["y0"].append(key + (-sy[-1],))
            segments["y1"].append(sy)
    elif self.inner == "stick":
        for value in values:
            sidx = np.argmin(np.abs(xs - value))
            sx, sy = xs[sidx], ys[sidx]
            segments["x"].append(sx)
            segments["y0"].append(key + (-sy[-1],))
            segments["y1"].append(sy)
    elif self.inner == "box":
        xpos = key + (0,)
        q1, q2, q3 = (np.percentile(values, q=q) for q in range(25, 100, 25))
        iqr = q3 - q1
        upper = min(q3 + 1.5 * iqr, np.nanmax(values))
        lower = max(q1 - 1.5 * iqr, np.nanmin(values))
        segments["x"].append(xpos)
        segments["y0"].append(lower)
        segments["y1"].append(upper)
        bars["x"].append(xpos)
        bars["bottom"].append(q1)
        bars["top"].append(q3)
        scatter["x"] = xpos
        scatter["y"] = q2
    return kde, segments, bars, scatter


# Traceback (holoviews.core.data.interface.DataError)
Error
Traceback (most recent call last):
File "/home/holoviews/holoviews/plotting/bokeh/element.py", line 1205, in _init_glyphs
group_style = self._apply_transforms(element, ds_data, ranges, group_style, style_group)
File "/home/holoviews/holoviews/plotting/bokeh/stats.py", line 105, in _apply_transforms
element = element.clone([(element.aggregate(function=np.mean),)])
File "/home/holoviews/holoviews/core/data/__init__.py", line 852, in clone
return super(Dataset, self).clone(data, shared_data, new_type, *args, **overrides)
File "/home/holoviews/holoviews/core/dimension.py", line 688, in clone
return clone_type(data, *args, **{k:v for k,v in settings.items()
File "/home/holoviews/holoviews/core/data/__init__.py", line 210, in __init__
datatype=kwargs.get('datatype'))
File "/home/holoviews/holoviews/core/data/interface.py", line 236, in initialize
(data, dims, extra_kws) = interface.init(eltype, data, kdims, vdims)
File "/home/holoviews/holoviews/core/data/multipath.py", line 44, in init
datatype=cls.subtypes)
File "/home/holoviews/holoviews/core/data/interface.py", line 251, in initialize
raise DataError(error)
holoviews.core.data.interface.DataError: None of the available storage backends were able to support the supplied data format.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.5/unittest/case.py", line 59, in testPartExecutor
yield
File "/usr/lib/python3.5/unittest/case.py", line 605, in run
testMethod()
File "/home/holoviews/holoviews/tests/plotting/bokeh/testviolinplot.py", line 90, in test_violin_empty
plot = bokeh_renderer.get_plot(violin)
File "/home/holoviews/holoviews/plotting/bokeh/renderer.py", line 134, in get_plot
plot = super(BokehRenderer, self_or_cls).get_plot(obj, renderer, **kwargs)
File "/home/holoviews/holoviews/plotting/renderer.py", line 207, in get_plot
plot.update(init_key)
File "/home/holoviews/holoviews/plotting/plot.py", line 595, in update
return self.initialize_plot()
File "/home/holoviews/holoviews/plotting/bokeh/element.py", line 1049, in initialize_plot
self._init_glyphs(plot, element, ranges, source)
File "/home/holoviews/holoviews/plotting/bokeh/element.py", line 1205, in _init_glyphs
group_style = self._apply_transforms(element, ds_data, ranges, group_style, style_group)
File "/home/holoviews/holoviews/core/options.py", line 297, in __exit__
raise AbbreviatedException(etype, value, traceback)
holoviews.core.options.AbbreviatedException: DataError: None of the available storage backends were able to support the supplied data format.

# Fixed code
def _kde_data(self, el, key, **kwargs):
    vdim = el.vdims[0]
    values = el.dimension_values(vdim)
    if self.clip:
        vdim = vdim(range=self.clip)
        el = el.clone(vdims=[vdim])
    kde = univariate_kde(el, dimension=vdim, **kwargs)
    xs, ys = (kde.dimension_values(i) for i in range(2))
    mask = isfinite(ys) & (ys > 0)  # Mask out non-finite and zero values
    xs, ys = xs[mask], ys[mask]
    ys = (ys / ys.max()) * (self.violin_width / 2.0) if len(ys) else []
    ys = [key + (sign * y,) for sign, vs in ((-1, ys), (1, ys[::-1])) for y in vs]
    xs = np.concatenate([xs, xs[::-1]])
    kde = {"ys": xs, "xs": ys}

    bars, segments, scatter = defaultdict(list), defaultdict(list), {}
    values = el.dimension_values(vdim)
    values = values[isfinite(values)]
    if not len(values):
        pass
    elif self.inner == "quartiles":
        for stat_fn in self._stat_fns:
            stat = stat_fn(values)
            if len(xs):
                sidx = np.argmin(np.abs(xs - stat))
                sx, sy = xs[sidx], ys[sidx]
            else:
                continue
            segments["x"].append(sx)
            segments["y0"].append(key + (-sy[-1],))
            segments["y1"].append(sy)
    elif self.inner == "stick":
        for value in values:
            sidx = np.argmin(np.abs(xs - value))
            sx, sy = xs[sidx], ys[sidx]
            segments["x"].append(sx)
            segments["y0"].append(key + (-sy[-1],))
            segments["y1"].append(sy)
    elif self.inner == "box":
        xpos = key + (0,)
        q1, q2, q3 = (np.percentile(values, q=q) for q in range(25, 100, 25))
        iqr = q3 - q1
        upper = min(q3 + 1.5 * iqr, np.nanmax(values))
        lower = max(q1 - 1.5 * iqr, np.nanmin(values))
        segments["x"].append(xpos)
        segments["y0"].append(lower)
        segments["y1"].append(upper)
        bars["x"].append(xpos)
        bars["bottom"].append(q1)
        bars["top"].append(q3)
        scatter["x"] = xpos
        scatter["y"] = q2
    return kde, segments, bars, scatter