diff --git a/arviz/data/inference_data.py b/arviz/data/inference_data.py
index cbfa34f..6a5985e 100644
--- a/arviz/data/inference_data.py
+++ b/arviz/data/inference_data.py
@@ -304,8 +304,8 @@ def concat(*args, dim=None, copy=True, inplace=False, reset_dim=True):
                     )
                     msg += " Valid dimensions are `chain` and `draw`."
                     raise TypeError(msg)
-            group_data = getattr(arg, group)
-            args_groups[group] = deepcopy(group_data) if copy else group_data
+                group_data = getattr(arg, group)
+                args_groups[group] = deepcopy(group_data) if copy else group_data
         # add arg0 to args_groups if inplace is False
         if not inplace:
             for group in arg0_groups:
diff --git a/arviz/plots/backends/bokeh/bokeh_violinplot.py b/arviz/plots/backends/bokeh/bokeh_violinplot.py
new file mode 100644
index 0000000..f77232a
--- /dev/null
+++ b/arviz/plots/backends/bokeh/bokeh_violinplot.py
@@ -0,0 +1,101 @@
+"""Bokeh Violinplot."""
+import bokeh.plotting as bkp
+from bokeh.layouts import gridplot
+from bokeh.models.annotations import Title
+import numpy as np
+
+from ....stats import hpd
+from ....stats.stats_utils import histogram
+from ...kdeplot import _fast_kde
+from ...plot_utils import get_bins, make_label, _create_axes_grid
+
+
+def _plot_violin(
+    ax,
+    plotters,
+    figsize,
+    rows,
+    cols,
+    sharey,
+    kwargs_shade,
+    shade,
+    bw,
+    credible_interval,
+    linewidth,
+    quartiles,
+    show,
+):
+    if ax is None:
+        _, ax = _create_axes_grid(
+            len(plotters),
+            rows,
+            cols,
+            sharey=sharey,
+            figsize=figsize,
+            squeeze=False,
+            backend="bokeh",
+        )
+
+    ax = np.atleast_1d(ax)
+
+    for (var_name, selection, x), ax_ in zip(plotters, ax.flatten()):
+        val = x.flatten()
+        if val[0].dtype.kind == "i":
+            cat_hist(val, shade, ax_, **kwargs_shade)
+        else:
+            _violinplot(val, shade, bw, ax_, **kwargs_shade)
+
+        per = np.percentile(val, [25, 75, 50])
+        hpd_intervals = hpd(val, credible_interval, multimodal=False)
+
+        if quartiles:
+            ax_.line([0, 0], per[:2], line_width=linewidth * 3, line_color="black")
+        ax_.line([0, 0], hpd_intervals, line_width=linewidth, line_color="black")
+        ax_.circle(0, per[-1])
+
+        _title = Title()
+        _title.text = make_label(var_name, selection)
+        ax_.title = _title
+        ax_.xaxis.major_tick_line_color = None
+        ax_.xaxis.minor_tick_line_color = None
+        ax_.xaxis.major_label_text_font_size = "0pt"
+
+    if show:
+        grid = gridplot([list(item) for item in ax], toolbar_location="above")
+        bkp.show(grid)
+
+    return ax
+
+
+def _violinplot(val, shade, bw, ax, **kwargs_shade):
+    """Auxiliary function to plot violinplots."""
+    density, low_b, up_b = _fast_kde(val, bw=bw)
+    x = np.linspace(low_b, up_b, len(density))
+
+    x = np.concatenate([x, x[::-1]])
+    density = np.concatenate([-density, density[::-1]])
+
+    ax.patch(density, x, fill_alpha=shade, line_width=0, **kwargs_shade)
+
+
+def cat_hist(val, shade, ax, **kwargs_shade):
+    """Auxiliary function to plot discrete-violinplots."""
+    bins = get_bins(val)
+    _, binned_d, _ = histogram(val, bins=bins)
+
+    bin_edges = np.linspace(np.min(val), np.max(val), len(bins))
+    centers = 0.5 * (bin_edges + np.roll(bin_edges, 1))[:-1]
+    heights = np.diff(bin_edges)
+
+    lefts = -0.5 * binned_d
+
+    ax.hbar(
+        y=centers,
+        left=lefts,
+        right=-lefts,
+        height=heights,
+        fill_alpha=shade,
+        line_alpha=shade,
+        line_color=None,
+        **kwargs_shade
+    )
diff --git a/arviz/plots/backends/matplotlib/mpl_violinplot.py b/arviz/plots/backends/matplotlib/mpl_violinplot.py
new file mode 100644
index 0000000..725149d
--- /dev/null
+++ b/arviz/plots/backends/matplotlib/mpl_violinplot.py
@@ -0,0 +1,77 @@
+"""Matplotlib Violinplot."""
+import numpy as np
+
+from ....stats import hpd
+from ....stats.stats_utils import histogram
+from ...kdeplot import _fast_kde
+from ...plot_utils import get_bins, make_label, _create_axes_grid
+
+
+def _plot_violin(
+    ax,
+    plotters,
+    figsize,
+    rows,
+    cols,
+    sharey,
+    kwargs_shade,
+    shade,
+    bw,
+    credible_interval,
+    linewidth,
+    ax_labelsize,
+    xt_labelsize,
+    quartiles,
+):
+    if ax is None:
+        _, ax = _create_axes_grid(
+            len(plotters), rows, cols, sharey=sharey, figsize=figsize, squeeze=False
+        )
+
+    ax = np.atleast_1d(ax)
+
+    for (var_name, selection, x), ax_ in zip(plotters, ax.flatten()):
+        val = x.flatten()
+        if val[0].dtype.kind == "i":
+            cat_hist(val, shade, ax_, **kwargs_shade)
+        else:
+            _violinplot(val, shade, bw, ax_, **kwargs_shade)
+
+        per = np.percentile(val, [25, 75, 50])
+        hpd_intervals = hpd(val, credible_interval, multimodal=False)
+
+        if quartiles:
+            ax_.plot([0, 0], per[:2], lw=linewidth * 3, color="k", solid_capstyle="round")
+        ax_.plot([0, 0], hpd_intervals, lw=linewidth, color="k", solid_capstyle="round")
+        ax_.plot(0, per[-1], "wo", ms=linewidth * 1.5)
+
+        ax_.set_xlabel(make_label(var_name, selection), fontsize=ax_labelsize)
+        ax_.set_xticks([])
+        ax_.tick_params(labelsize=xt_labelsize)
+        ax_.grid(None, axis="x")
+
+    return ax
+
+
+def _violinplot(val, shade, bw, ax, **kwargs_shade):
+    """Auxiliary function to plot violinplots."""
+    density, low_b, up_b = _fast_kde(val, bw=bw)
+    x = np.linspace(low_b, up_b, len(density))
+
+    x = np.concatenate([x, x[::-1]])
+    density = np.concatenate([-density, density[::-1]])
+
+    ax.fill_betweenx(x, density, alpha=shade, lw=0, **kwargs_shade)
+
+
+def cat_hist(val, shade, ax, **kwargs_shade):
+    """Auxiliary function to plot discrete-violinplots."""
+    bins = get_bins(val)
+    _, binned_d, _ = histogram(val, bins=bins)
+
+    bin_edges = np.linspace(np.min(val), np.max(val), len(bins))
+    centers = 0.5 * (bin_edges + np.roll(bin_edges, 1))[:-1]
+    heights = np.diff(bin_edges)
+
+    lefts = -0.5 * binned_d
+    ax.barh(centers, binned_d, height=heights, left=lefts, alpha=shade, **kwargs_shade)
diff --git a/arviz/plots/violinplot.py b/arviz/plots/violinplot.py
index bfc1686..b8e621b 100644
--- a/arviz/plots/violinplot.py
+++ b/arviz/plots/violinplot.py
@@ -1,12 +1,6 @@
 """Plot posterior traces as violin plot."""
-import matplotlib.pyplot as plt
-import numpy as np
-
 from ..data import convert_to_dataset
-from ..stats import hpd
-from ..stats.stats_utils import histogram
-from .kdeplot import _fast_kde
-from .plot_utils import get_bins, _scale_fig_size, xarray_var_iter, make_label, filter_plotters_list
+from .plot_utils import _scale_fig_size, xarray_var_iter, filter_plotters_list, default_grid
 from ..utils import _var_names
 
 
@@ -22,6 +16,8 @@ def plot_violin(
     textsize=None,
     ax=None,
     kwargs_shade=None,
+    backend=None,
+    show=True,
 ):
     """Plot posterior of traces as violin plot.
 
@@ -73,68 +69,40 @@ def plot_violin(
     if kwargs_shade is None:
         kwargs_shade = {}
 
+    rows, cols = default_grid(len(plotters))
+
     (figsize, ax_labelsize, _, xt_labelsize, linewidth, _) = _scale_fig_size(
-        figsize, textsize, 1, len(plotters)
+        figsize, textsize, rows, cols
     )
     ax_labelsize *= 2
 
-    if ax is None:
-        fig, ax = plt.subplots(
-            1, len(plotters), figsize=figsize, sharey=sharey, constrained_layout=True
-        )
-
-    else:
-        fig = ax.figure
-
-    ax = np.atleast_1d(ax)
-
-    for axind, (var_name, selection, x) in enumerate(plotters):
-        val = x.flatten()
-        if val[0].dtype.kind == "i":
-            cat_hist(val, shade, ax[axind], **kwargs_shade)
-        else:
-            _violinplot(val, shade, bw, ax[axind], **kwargs_shade)
-
-        per = np.percentile(val, [25, 75, 50])
-        hpd_intervals = hpd(val, credible_interval, multimodal=False)
-
-        if quartiles:
-            ax[axind].plot([0, 0], per[:2], lw=linewidth * 3, color="k", solid_capstyle="round")
-        ax[axind].plot([0, 0], hpd_intervals, lw=linewidth, color="k", solid_capstyle="round")
-        ax[axind].plot(0, per[-1], "wo", ms=linewidth * 1.5)
+    violinplot_kwargs = dict(
+        ax=ax,
+        plotters=plotters,
+        figsize=figsize,
+        rows=rows,
+        cols=cols,
+        sharey=sharey,
+        kwargs_shade=kwargs_shade,
+        shade=shade,
+        bw=bw,
+        credible_interval=credible_interval,
+        linewidth=linewidth,
+        ax_labelsize=ax_labelsize,
+        xt_labelsize=xt_labelsize,
+        quartiles=quartiles,
+    )
 
-        ax[axind].set_xlabel(make_label(var_name, selection), fontsize=ax_labelsize)
-        ax[axind].set_xticks([])
-        ax[axind].tick_params(labelsize=xt_labelsize)
-        ax[axind].grid(None, axis="x")
+    if backend == "bokeh":
+        from .backends.bokeh.bokeh_violinplot import _plot_violin
 
-    if sharey:
-        fig.subplots_adjust(wspace=0)
+        violinplot_kwargs.pop("ax_labelsize")
+        violinplot_kwargs.pop("xt_labelsize")
+        violinplot_kwargs["show"] = show
+        ax = _plot_violin(**violinplot_kwargs)  #  pylint: disable=unexpected-keyword-arg
     else:
-        fig.tight_layout()
+        from .backends.matplotlib.mpl_violinplot import _plot_violin
 
-    return ax
-
-
-def _violinplot(val, shade, bw, ax, **kwargs_shade):
-    """Auxiliary function to plot violinplots."""
-    density, low_b, up_b = _fast_kde(val, bw=bw)
-    x = np.linspace(low_b, up_b, len(density))
-
-    x = np.concatenate([x, x[::-1]])
-    density = np.concatenate([-density, density[::-1]])
-
-    ax.fill_betweenx(x, density, alpha=shade, lw=0, **kwargs_shade)
+        ax = _plot_violin(**violinplot_kwargs)
 
-
-def cat_hist(val, shade, ax, **kwargs_shade):
-    """Auxiliary function to plot discrete-violinplots."""
-    bins = get_bins(val)
-    _, binned_d, _ = histogram(val, bins=bins)
-
-    bin_edges = np.linspace(np.min(val), np.max(val), len(bins))
-    centers = 0.5 * (bin_edges + np.roll(bin_edges, 1))[:-1]
-    heights = np.diff(bin_edges)
-
-    lefts = -0.5 * binned_d
-    ax.barh(centers, binned_d, height=heights, left=lefts, alpha=shade, **kwargs_shade)
+    return ax

Concat fails with empty InferenceData
**Describe the bug**
`arviz.concat` produces incorrect outputs when one of the arguments is an `InferenceData` with no groups.

**To Reproduce**
```python
>>> import arviz as az

>>> idata = az.load_arviz_data("centered_eight")

>>> idata
Inference data with groups:
    > posterior
    > sample_stats
    > posterior_predictive
    > prior
    > observed_data

>>> az.concat(idata, az.InferenceData())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/arviz/data/inference_data.py", line 307, in concat
    group_data = getattr(arg, group)
UnboundLocalError: local variable 'group' referenced before assignment

>>> az.concat(az.InferenceData(), idata)
Inference data with groups:
    > observed_data
```

**Expected behavior**
Both `concat` commands should have produced an `InferenceData` with the same groups and data as `idata`.

**Additional context**
Using master branch on OS X.

diff --git a/arviz/tests/test_data.py b/arviz/tests/test_data.py
index d55387d..6038d00 100644
--- a/arviz/tests/test_data.py
+++ b/arviz/tests/test_data.py
@@ -303,6 +303,22 @@ def test_concat_bad():
         concat(idata3, idata, dim="chain")
 
 
+def test_inference_concat_keeps_all_fields():
+    """From failures observed in issue #907"""
+    idata1 = from_dict(posterior={"A": [1, 2, 3, 4]}, sample_stats={"B": [2, 3, 4, 5]})
+    idata2 = from_dict(prior={"C": [1, 2, 3, 4]}, observed_data={"D": [2, 3, 4, 5]})
+
+    idata_c1 = concat(idata1, idata2)
+    idata_c2 = concat(idata2, idata1)
+
+    test_dict = {"posterior": ["A"], "sample_stats": ["B"], "prior": ["C"], "observed_data": ["D"]}
+
+    fails_c1 = check_multiple_attrs(test_dict, idata_c1)
+    assert not fails_c1
+    fails_c2 = check_multiple_attrs(test_dict, idata_c2)
+    assert not fails_c2
+
+
 @pytest.mark.parametrize("inplace", [True, False])
 def test_sel_method(inplace):
     data = np.random.normal(size=(4, 500, 8))
diff --git a/arviz/tests/test_plots_bokeh.py b/arviz/tests/test_plots_bokeh.py
index bd4987d..adbf14c 100644
--- a/arviz/tests/test_plots_bokeh.py
+++ b/arviz/tests/test_plots_bokeh.py
@@ -1,6 +1,7 @@
 """Tests use the 'bokeh' backend."""
 # pylint: disable=redefined-outer-name,too-many-lines
 from copy import deepcopy
+import bokeh.plotting as bkp
 from pandas import DataFrame
 import numpy as np
 import pytest
@@ -32,6 +33,7 @@ from ..plots import (
     plot_pair,
     plot_trace,
     plot_parallel,
+    plot_violin,
 )
 from ..stats import compare, loo, waic
 
@@ -749,3 +751,27 @@ def test_plot_parallel_exception(models, var_names):
     """Ensure that correct exception is raised when one variable is passed."""
     with pytest.raises(ValueError):
         assert plot_parallel(models.model_1, var_names=var_names, norm_method="foo")
+
+
+@pytest.mark.parametrize("var_names", (None, "mu", ["mu", "tau"]))
+def test_plot_violin(models, var_names):
+    axes = plot_violin(models.model_1, var_names=var_names, backend="bokeh", show=False)
+    assert axes.shape
+
+
+def test_plot_violin_ax(models):
+    ax = bkp.figure()
+    axes = plot_violin(models.model_1, var_names="mu", ax=ax, backend="bokeh", show=False)
+    assert axes.shape
+
+
+def test_plot_violin_layout(models):
+    axes = plot_violin(
+        models.model_1, var_names=["mu", "tau"], sharey=False, backend="bokeh", show=False
+    )
+    assert axes.shape
+
+
+def test_plot_violin_discrete(discrete_model):
+    axes = plot_violin(discrete_model, backend="bokeh", show=False)
+    assert axes.shape

pip install -e .[all]
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/arviz-devs/arviz.git@549ed97ebfa47d2fa473453b765d738aecfe14d0#egg=arviz
attrs==22.2.0
bokeh==2.3.3
certifi==2021.5.30
cftime==1.6.0
coverage==6.2
cycler==0.11.0
importlib-metadata==4.8.3
iniconfig==1.1.1
Jinja2==3.0.3
kiwisolver==1.3.1
llvmlite==0.36.0
MarkupSafe==2.0.1
matplotlib==3.3.4
netCDF4==1.6.1
numba==0.53.1
numpy==1.19.5
packaging==21.3
pandas==1.1.5
Pillow==8.4.0
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.1
scipy==1.5.4
six==1.17.0
tomli==1.2.3
tornado==6.1
typing_extensions==4.1.1
xarray==0.16.2
zipp==3.6.0

name: arviz
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - bokeh==2.3.3
      - cftime==1.6.0
      - coverage==6.2
      - cycler==0.11.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - jinja2==3.0.3
      - kiwisolver==1.3.1
      - llvmlite==0.36.0
      - markupsafe==2.0.1
      - matplotlib==3.3.4
      - netcdf4==1.6.1
      - numba==0.53.1
      - numpy==1.19.5
      - packaging==21.3
      - pandas==1.1.5
      - pillow==8.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.1
      - scipy==1.5.4
      - six==1.17.0
      - tomli==1.2.3
      - tornado==6.1
      - typing-extensions==4.1.1
      - xarray==0.16.2
      - zipp==3.6.0
prefix: /opt/conda/envs/arviz

arviz/tests/test_data.py::test_inference_concat_keeps_all_fields arviz/tests/test_plots_bokeh.py::test_plot_violin[None] arviz/tests/test_plots_bokeh.py::test_plot_violin[mu] arviz/tests/test_plots_bokeh.py::test_plot_violin[var_names2] arviz/tests/test_plots_bokeh.py::test_plot_violin_ax arviz/tests/test_plots_bokeh.py::test_plot_violin_layout
arviz/tests/test_plots_bokeh.py::test_plot_trace_discrete arviz/tests/test_plots_bokeh.py::test_plot_dist[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_energy[hist] arviz/tests/test_plots_bokeh.py::test_plot_joint_discrete arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat[elpd_data-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat[data_array-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat[array-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[elpd_data-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[data_array-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_khat_multidim[array-kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_khat_annotate arviz/tests/test_plots_bokeh.py::test_plot_violin_discrete
arviz/tests/test_data.py::test_load_local_arviz_data arviz/tests/test_data.py::test_clear_data_home arviz/tests/test_data.py::test_load_remote_arviz_data arviz/tests/test_data.py::test_bad_checksum arviz/tests/test_data.py::test_missing_dataset arviz/tests/test_data.py::test_list_datasets arviz/tests/test_data.py::test_dims_coords arviz/tests/test_data.py::test_dims_coords_extra_dims arviz/tests/test_data.py::test_make_attrs arviz/tests/test_data.py::test_addition arviz/tests/test_data.py::test_concat_group[True-True-True] arviz/tests/test_data.py::test_concat_group[True-True-False] arviz/tests/test_data.py::test_concat_group[True-False-True] arviz/tests/test_data.py::test_concat_group[True-False-False] arviz/tests/test_data.py::test_concat_group[False-True-True] arviz/tests/test_data.py::test_concat_group[False-True-False] arviz/tests/test_data.py::test_concat_group[False-False-True] arviz/tests/test_data.py::test_concat_group[False-False-False] arviz/tests/test_data.py::test_concat_dim[True-True-True-True-chain] arviz/tests/test_data.py::test_concat_dim[True-True-True-True-draw] arviz/tests/test_data.py::test_concat_dim[True-True-True-False-chain] arviz/tests/test_data.py::test_concat_dim[True-True-True-False-draw] arviz/tests/test_data.py::test_concat_dim[True-True-False-True-chain] arviz/tests/test_data.py::test_concat_dim[True-True-False-True-draw] arviz/tests/test_data.py::test_concat_dim[True-True-False-False-chain] arviz/tests/test_data.py::test_concat_dim[True-True-False-False-draw] arviz/tests/test_data.py::test_concat_dim[True-False-True-True-chain] arviz/tests/test_data.py::test_concat_dim[True-False-True-True-draw] arviz/tests/test_data.py::test_concat_dim[True-False-True-False-chain] arviz/tests/test_data.py::test_concat_dim[True-False-True-False-draw] arviz/tests/test_data.py::test_concat_dim[True-False-False-True-chain] arviz/tests/test_data.py::test_concat_dim[True-False-False-True-draw] arviz/tests/test_data.py::test_concat_dim[True-False-False-False-chain] arviz/tests/test_data.py::test_concat_dim[True-False-False-False-draw] arviz/tests/test_data.py::test_concat_dim[False-True-True-True-chain] arviz/tests/test_data.py::test_concat_dim[False-True-True-True-draw] arviz/tests/test_data.py::test_concat_dim[False-True-True-False-chain] arviz/tests/test_data.py::test_concat_dim[False-True-True-False-draw] arviz/tests/test_data.py::test_concat_dim[False-True-False-True-chain] arviz/tests/test_data.py::test_concat_dim[False-True-False-True-draw] arviz/tests/test_data.py::test_concat_dim[False-True-False-False-chain] arviz/tests/test_data.py::test_concat_dim[False-True-False-False-draw] arviz/tests/test_data.py::test_concat_dim[False-False-True-True-chain] arviz/tests/test_data.py::test_concat_dim[False-False-True-True-draw] arviz/tests/test_data.py::test_concat_dim[False-False-True-False-chain] arviz/tests/test_data.py::test_concat_dim[False-False-True-False-draw] arviz/tests/test_data.py::test_concat_dim[False-False-False-True-chain] arviz/tests/test_data.py::test_concat_dim[False-False-False-True-draw] arviz/tests/test_data.py::test_concat_dim[False-False-False-False-chain] arviz/tests/test_data.py::test_concat_dim[False-False-False-False-draw] arviz/tests/test_data.py::test_concat_edgecases[True-True-True] arviz/tests/test_data.py::test_concat_edgecases[True-True-False] arviz/tests/test_data.py::test_concat_edgecases[True-False-True] arviz/tests/test_data.py::test_concat_edgecases[True-False-False] arviz/tests/test_data.py::test_concat_edgecases[False-True-True] arviz/tests/test_data.py::test_concat_edgecases[False-True-False] arviz/tests/test_data.py::test_concat_edgecases[False-False-True] arviz/tests/test_data.py::test_concat_edgecases[False-False-False] arviz/tests/test_data.py::test_concat_bad arviz/tests/test_data.py::test_sel_method[True] arviz/tests/test_data.py::test_sel_method[False] arviz/tests/test_data.py::test_sel_method_chain_prior arviz/tests/test_data.py::test_del_method[del] arviz/tests/test_data.py::test_del_method[delattr] arviz/tests/test_data.py::TestNumpyToDataArray::test_1d_dataset arviz/tests/test_data.py::TestNumpyToDataArray::test_warns_bad_shape arviz/tests/test_data.py::TestNumpyToDataArray::test_nd_to_dataset arviz/tests/test_data.py::TestNumpyToDataArray::test_nd_to_inference_data arviz/tests/test_data.py::TestNumpyToDataArray::test_more_chains_than_draws arviz/tests/test_data.py::TestConvertToDataset::test_use_all arviz/tests/test_data.py::TestConvertToDataset::test_missing_coords arviz/tests/test_data.py::TestConvertToDataset::test_missing_dims arviz/tests/test_data.py::TestConvertToDataset::test_skip_dim_0 arviz/tests/test_data.py::test_dict_to_dataset arviz/tests/test_data.py::test_convert_to_dataset_idempotent arviz/tests/test_data.py::test_convert_to_inference_data_idempotent arviz/tests/test_data.py::test_convert_to_inference_data_from_file arviz/tests/test_data.py::test_convert_to_inference_data_bad arviz/tests/test_data.py::test_convert_to_dataset_bad arviz/tests/test_data.py::test_bad_inference_data arviz/tests/test_data.py::TestDataConvert::test_convert_to_inference_data arviz/tests/test_data.py::TestDataConvert::test_convert_to_dataset arviz/tests/test_data.py::TestDataDict::test_inference_data arviz/tests/test_data.py::TestDataDict::test_inference_data_edge_cases arviz/tests/test_data.py::TestDataDict::test_inference_data_bad arviz/tests/test_data.py::TestDataDict::test_from_dict_warning arviz/tests/test_data.py::TestDataNetCDF::test_io_function arviz/tests/test_data.py::TestDataNetCDF::test_io_method[False] arviz/tests/test_data.py::TestDataNetCDF::test_io_method[True] arviz/tests/test_data.py::TestDataNetCDF::test_empty_inference_data_object arviz/tests/test_data.py::TestConversions::test_id_conversion_idempotent arviz/tests/test_data.py::TestConversions::test_dataset_conversion_idempotent arviz/tests/test_data.py::TestConversions::test_id_conversion_args arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_density_float[kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_density_discrete arviz/tests/test_plots_bokeh.py::test_plot_density_bad_kwargs arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs7] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs8] arviz/tests/test_plots_bokeh.py::test_plot_trace[kwargs9] arviz/tests/test_plots_bokeh.py::test_plot_trace_max_subplots_warning arviz/tests/test_plots_bokeh.py::test_plot_kde[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_kde[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_kde[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_kde[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_kde[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_kde_cumulative[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_kde_cumulative[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_kde_cumulative[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_kde_cumulative[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_dist[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_kde_1d arviz/tests/test_plots_bokeh.py::test_plot_kde_2d[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_kde_2d[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_kde_2d[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_kde_2d[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_kde_quantiles[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_kde_quantiles[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_kde_quantiles[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_autocorr_short_chain arviz/tests/test_plots_bokeh.py::test_plot_autocorr_uncombined arviz/tests/test_plots_bokeh.py::test_plot_autocorr_combined arviz/tests/test_plots_bokeh.py::test_plot_autocorr_var_names[None] arviz/tests/test_plots_bokeh.py::test_plot_autocorr_var_names[mu] arviz/tests/test_plots_bokeh.py::test_plot_autocorr_var_names[var_names2] arviz/tests/test_plots_bokeh.py::test_plot_compare[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_compare[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_compare[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_compare_manual arviz/tests/test_plots_bokeh.py::test_plot_compare_no_ic arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-False-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-False-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-False-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-True-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-True-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd[False-True-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-False-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-False-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-False-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-True-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-True-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd[True-True-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-False-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-False-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-False-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-True-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-True-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[False-True-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-False-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-False-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-False-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-True-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-True-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_elpd_multidim[True-True-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_energy[kde] arviz/tests/test_plots_bokeh.py::test_plot_energy_bad arviz/tests/test_plots_bokeh.py::test_plot_ess[local-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_ess[local-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_ess[local-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_ess[local-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_ess[quantile-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_ess[quantile-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_ess[quantile-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_ess[quantile-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_ess[evolution-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_ess[evolution-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_ess[evolution-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_ess[evolution-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[local-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[local-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[local-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[local-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[local-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[quantile-kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[quantile-kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[quantile-kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[quantile-kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_ess_local_quantile[quantile-kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_ess_evolution arviz/tests/test_plots_bokeh.py::test_plot_ess_bad_kind arviz/tests/test_plots_bokeh.py::test_plot_ess_bad_coords[chain] arviz/tests/test_plots_bokeh.py::test_plot_ess_bad_coords[draw] arviz/tests/test_plots_bokeh.py::test_plot_ess_no_sample_stats arviz/tests/test_plots_bokeh.py::test_plot_ess_no_divergences arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected0-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected0-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected1-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected1-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected2-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected2-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected3-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected3-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected4-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected4-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected5-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected5-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected6-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected6-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected7-model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest[args_expected7-model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_forest_rope_exception arviz/tests/test_plots_bokeh.py::test_plot_forest_single_value arviz/tests/test_plots_bokeh.py::test_plot_forest_bad[model_fits0] arviz/tests/test_plots_bokeh.py::test_plot_forest_bad[model_fits1] arviz/tests/test_plots_bokeh.py::test_plot_hpd[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_hpd[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_hpd[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_hpd[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_hpd[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_joint[scatter] arviz/tests/test_plots_bokeh.py::test_plot_joint[hexbin] arviz/tests/test_plots_bokeh.py::test_plot_joint[kde] arviz/tests/test_plots_bokeh.py::test_plot_joint_ax_tuple arviz/tests/test_plots_bokeh.py::test_plot_joint_bad arviz/tests/test_plots_bokeh.py::test_plot_khat_bad_input arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit[kwargs7] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_incompatible_args arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_label[args0] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_label[args1] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_label[args2] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_label[args3] arviz/tests/test_plots_bokeh.py::test_plot_loo_pit_label[args4] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_mcse[kwargs6] arviz/tests/test_plots_bokeh.py::test_plot_mcse_bad_coords[chain] arviz/tests/test_plots_bokeh.py::test_plot_mcse_bad_coords[draw] arviz/tests/test_plots_bokeh.py::test_plot_mcse_no_sample_stats arviz/tests/test_plots_bokeh.py::test_plot_mcse_no_divergences arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs3] arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs4] arviz/tests/test_plots_bokeh.py::test_plot_pair[kwargs5] arviz/tests/test_plots_bokeh.py::test_plot_pair_2var[kwargs0] arviz/tests/test_plots_bokeh.py::test_plot_pair_2var[kwargs1] arviz/tests/test_plots_bokeh.py::test_plot_pair_2var[kwargs2] arviz/tests/test_plots_bokeh.py::test_plot_pair_bad arviz/tests/test_plots_bokeh.py::test_plot_pair_divergences_warning[True] arviz/tests/test_plots_bokeh.py::test_plot_pair_divergences_warning[False] arviz/tests/test_plots_bokeh.py::test_plot_parallel_raises_valueerror arviz/tests/test_plots_bokeh.py::test_plot_parallel[None] arviz/tests/test_plots_bokeh.py::test_plot_parallel[normal] arviz/tests/test_plots_bokeh.py::test_plot_parallel[minmax] arviz/tests/test_plots_bokeh.py::test_plot_parallel[rank] arviz/tests/test_plots_bokeh.py::test_plot_parallel_exception[None] arviz/tests/test_plots_bokeh.py::test_plot_parallel_exception[mu] arviz/tests/test_plots_bokeh.py::test_plot_parallel_exception[var_names2]
arviz/plots/backends/matplotlib/mpl_violinplot.py arviz/data/inference_data.py arviz/plots/violinplot.py arviz/plots/backends/bokeh/bokeh_violinplot.py
arviz/plots/backends/matplotlib/mpl_violinplot.py arviz/data/inference_data.py arviz/plots/violinplot.py arviz/plots/backends/bokeh/bokeh_violinplot.py