Repository: arviz-devs/arviz

Issue:
plot_forest; HPD not visible with kind="ridgeplot"
Not sure if a bug or just not a feature that's available, but in using plot_forest() I'm able to see the HPD when using kind="forestplot" but not with kind="ridgeplot". One of the things I liked about bayesplot in R was being able to see the the HPD of the marginal posteriors with the mcmc_areas() function. Is that possible with plot_forest(kind="ridgeplot")? Specifying hdi_prob seems to have no effect with the ridgeplot.

(Appreciate the development effort on arviz btw, been a huge help since switching over to Python for my bayesian modeling) 


Discussion:
Thanks for taking the time to report this. I had the impression this was implemented, even more I remember working on this. It seems I never push the changes, haha. I will do it. 

And glad to hear you find ArviZ useful! 

Resolving patch:
diff --git a/arviz/plots/backends/bokeh/forestplot.py b/arviz/plots/backends/bokeh/forestplot.py
--- a/arviz/plots/backends/bokeh/forestplot.py
+++ b/arviz/plots/backends/bokeh/forestplot.py
@@ -46,6 +46,7 @@ def plot_forest(
     ridgeplot_overlap,
     ridgeplot_alpha,
     ridgeplot_kind,
+    ridgeplot_truncate,
     ridgeplot_quantiles,
     textsize,
     ess,
@@ -119,10 +120,13 @@ def plot_forest(
         )
     elif kind == "ridgeplot":
         plot_handler.ridgeplot(
+            hdi_prob,
             ridgeplot_overlap,
             linewidth,
+            markersize,
             ridgeplot_alpha,
             ridgeplot_kind,
+            ridgeplot_truncate,
             ridgeplot_quantiles,
             axes[0, 0],
         )
@@ -270,27 +274,49 @@ def display_multiple_ropes(self, rope, ax, y, linewidth, rope_var):
         )
         return ax
 
-    def ridgeplot(self, mult, linewidth, alpha, ridgeplot_kind, ridgeplot_quantiles, ax):
+    def ridgeplot(
+        self,
+        hdi_prob,
+        mult,
+        linewidth,
+        markersize,
+        alpha,
+        ridgeplot_kind,
+        ridgeplot_truncate,
+        ridgeplot_quantiles,
+        ax,
+    ):
         """Draw ridgeplot for each plotter.
 
         Parameters
         ----------
+        hdi_prob : float
+            Probability for the highest density interval.
         mult : float
             How much to multiply height by. Set this to greater than 1 to have some overlap.
         linewidth : float
             Width of line on border of ridges
+        markersize : float
+            Size of marker in center of forestplot line
         alpha : float
             Transparency of ridges
-        kind : string
+        ridgeplot_kind : string
             By default ("auto") continuous variables are plotted using KDEs and discrete ones using
             histograms. To override this use "hist" to plot histograms and "density" for KDEs
+        ridgeplot_truncate: bool
+            Whether to truncate densities according to the value of hdi_prop. Defaults to True
+        ridgeplot_quantiles: list
+            Quantiles in ascending order used to segment the KDE. Use [.25, .5, .75] for quartiles.
+            Defaults to None.
         ax : Axes
             Axes to draw on
         """
         if alpha is None:
             alpha = 1.0
         for plotter in list(self.plotters.values())[::-1]:
-            for x, y_min, y_max, y_q, color in list(plotter.ridgeplot(mult, ridgeplot_kind))[::-1]:
+            for x, y_min, y_max, hdi_, y_q, color in plotter.ridgeplot(
+                hdi_prob, mult, ridgeplot_kind
+            ):
                 if alpha == 0:
                     border = color
                     facecolor = None
@@ -298,50 +324,66 @@ def ridgeplot(self, mult, linewidth, alpha, ridgeplot_kind, ridgeplot_quantiles,
                     border = "black"
                     facecolor = color
                 if x.dtype.kind == "i":
+                    if ridgeplot_truncate:
+                        y_max = y_max[(x >= hdi_[0]) & (x <= hdi_[1])]
+                        x = x[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    else:
+                        facecolor = color
+                        alpha = [alpha if ci else 0 for ci in ((x >= hdi_[0]) & (x <= hdi_[1]))]
+                    y_min = np.ones_like(x) * y_min
                     ax.vbar(
                         x=x,
                         top=y_max - y_min,
                         bottom=y_min,
+                        width=0.9,
+                        line_color=border,
+                        color=facecolor,
                         fill_alpha=alpha,
-                        fill_color=facecolor,
                     )
                 else:
-                    if ridgeplot_quantiles is None:
-                        patch = ax.patch(
-                            np.concatenate([x, x[::-1]]),
-                            np.concatenate([y_min, y_max[::-1]]),
-                            fill_color=color,
-                            fill_alpha=alpha,
+                    tr_x = x[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    tr_y_min = np.ones_like(tr_x) * y_min
+                    tr_y_max = y_max[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    y_min = np.ones_like(x) * y_min
+                    patch = ax.patch(
+                        np.concatenate([tr_x, tr_x[::-1]]),
+                        np.concatenate([tr_y_min, tr_y_max[::-1]]),
+                        fill_color=color,
+                        fill_alpha=alpha,
+                        line_width=0,
+                    )
+                    patch.level = "overlay"
+                    if ridgeplot_truncate:
+                        ax.line(
+                            x, y_max, line_dash="solid", line_width=linewidth, line_color=border
+                        )
+                        ax.line(
+                            x, y_min, line_dash="solid", line_width=linewidth, line_color=border
+                        )
+                    else:
+                        ax.line(
+                            tr_x,
+                            tr_y_max,
                             line_dash="solid",
                             line_width=linewidth,
                             line_color=border,
                         )
-                        patch.level = "overlay"
-                    else:
-                        quantiles = sorted(np.clip(ridgeplot_quantiles, 0, 1))
-                        if quantiles[0] != 0:
-                            quantiles = [0] + quantiles
-                        if quantiles[-1] != 1:
-                            quantiles = quantiles + [1]
-
-                        for quant_0, quant_1 in zip(quantiles[:-1], quantiles[1:]):
-                            idx = (y_q > quant_0) & (y_q < quant_1)
-                            if idx.sum():
-                                patch_x = np.concatenate(
-                                    (x[idx], [x[idx][-1]], x[idx][::-1], [x[idx][0]])
-                                )
-                                patch_y = np.concatenate(
-                                    (
-                                        y_min[idx],
-                                        [y_min[idx][-1]],
-                                        y_max[idx][::-1],
-                                        [y_max[idx][0]],
-                                    )
-                                )
-                                patch = ax.patch(
-                                    patch_x, patch_y, fill_color=color, fill_alpha=alpha,
-                                )
-                            patch.level = "overlay"
+                        ax.line(
+                            tr_x,
+                            tr_y_min,
+                            line_dash="solid",
+                            line_width=linewidth,
+                            line_color=border,
+                        )
+                if ridgeplot_quantiles is not None:
+                    quantiles = [x[np.sum(y_q < quant)] for quant in ridgeplot_quantiles]
+                    ax.diamond(
+                        quantiles,
+                        np.ones_like(quantiles) * y_min[0],
+                        line_color="black",
+                        fill_color="black",
+                        size=markersize,
+                    )
 
         return ax
 
@@ -351,7 +393,7 @@ def forestplot(self, hdi_prob, quartiles, linewidth, markersize, ax, rope):
         Parameters
         ----------
         hdi_prob : float
-            How wide each line should be
+            Probability for the highest density interval. Width of each line.
         quartiles : bool
             Whether to mark quartiles
         linewidth : float
@@ -551,15 +593,21 @@ def treeplot(self, qlist, hdi_prob):
             ntiles[0], ntiles[-1] = hdi(values.flatten(), hdi_prob, multimodal=False)
             yield y, label, ntiles, color
 
-    def ridgeplot(self, mult, ridgeplot_kind):
+    def ridgeplot(self, hdi_prob, mult, ridgeplot_kind):
         """Get data for each ridgeplot for the variable."""
-        xvals, yvals, pdfs, pdfs_q, colors = [], [], [], [], []
+        xvals, hdi_vals, yvals, pdfs, pdfs_q, colors = [], [], [], [], [], []
+
         for y, *_, values, color in self.iterator():
             yvals.append(y)
             colors.append(color)
             values = values.flatten()
             values = values[np.isfinite(values)]
 
+            if hdi_prob != 1:
+                hdi_ = hdi(values, hdi_prob, multimodal=False)
+            else:
+                hdi_ = min(values), max(values)
+
             if ridgeplot_kind == "auto":
                 kind = "hist" if np.all(np.mod(values, 1) == 0) else "density"
             else:
@@ -571,16 +619,17 @@ def ridgeplot(self, mult, ridgeplot_kind):
                 x = x[:-1]
             elif kind == "density":
                 x, density = kde(values)
-                density_q = density.cumsum() / density.sum()
+
+            density_q = density.cumsum() / density.sum()
 
             xvals.append(x)
             pdfs.append(density)
-            pdfs_q.append((density_q))
+            pdfs_q.append(density_q)
+            hdi_vals.append(hdi_)
 
         scaling = max(np.max(j) for j in pdfs)
-        for y, x, pdf, pdf_q, color in zip(yvals, xvals, pdfs, pdfs_q, colors):
-            y = y * np.ones_like(x)
-            yield x, y, mult * pdf / scaling + y, pdf_q, color
+        for y, x, hdi_val, pdf, pdf_q, color in zip(yvals, xvals, hdi_vals, pdfs, pdfs_q, colors):
+            yield x, y, mult * pdf / scaling + y, hdi_val, pdf_q, color
 
     def ess(self):
         """Get effective n data for the variable."""
diff --git a/arviz/plots/backends/matplotlib/forestplot.py b/arviz/plots/backends/matplotlib/forestplot.py
--- a/arviz/plots/backends/matplotlib/forestplot.py
+++ b/arviz/plots/backends/matplotlib/forestplot.py
@@ -40,6 +40,7 @@ def plot_forest(
     ridgeplot_overlap,
     ridgeplot_alpha,
     ridgeplot_kind,
+    ridgeplot_truncate,
     ridgeplot_quantiles,
     textsize,
     ess,
@@ -96,10 +97,13 @@ def plot_forest(
         )
     elif kind == "ridgeplot":
         plot_handler.ridgeplot(
+            hdi_prob,
             ridgeplot_overlap,
             linewidth,
+            markersize,
             ridgeplot_alpha,
             ridgeplot_kind,
+            ridgeplot_truncate,
             ridgeplot_quantiles,
             axes[0],
         )
@@ -233,20 +237,37 @@ def display_multiple_ropes(self, rope, ax, y, linewidth, rope_var):
         )
         return ax
 
-    def ridgeplot(self, mult, linewidth, alpha, ridgeplot_kind, ridgeplot_quantiles, ax):
+    def ridgeplot(
+        self,
+        hdi_prob,
+        mult,
+        linewidth,
+        markersize,
+        alpha,
+        ridgeplot_kind,
+        ridgeplot_truncate,
+        ridgeplot_quantiles,
+        ax,
+    ):
         """Draw ridgeplot for each plotter.
 
         Parameters
         ----------
+        hdi_prob : float
+            Probability for the highest density interval.
         mult : float
             How much to multiply height by. Set this to greater than 1 to have some overlap.
         linewidth : float
             Width of line on border of ridges
+        markersize : float
+            Size of marker in center of forestplot line
         alpha : float
             Transparency of ridges
         ridgeplot_kind : string
             By default ("auto") continuous variables are plotted using KDEs and discrete ones using
             histograms. To override this use "hist" to plot histograms and "density" for KDEs
+        ridgeplot_truncate: bool
+            Whether to truncate densities according to the value of hdi_prop. Defaults to True
         ridgeplot_quantiles: list
             Quantiles in ascending order used to segment the KDE. Use [.25, .5, .75] for quartiles.
             Defaults to None.
@@ -257,39 +278,64 @@ def ridgeplot(self, mult, linewidth, alpha, ridgeplot_kind, ridgeplot_quantiles,
             alpha = 1.0
         zorder = 0
         for plotter in self.plotters.values():
-            for x, y_min, y_max, y_q, color in plotter.ridgeplot(mult, ridgeplot_kind):
+            for x, y_min, y_max, hdi_, y_q, color in plotter.ridgeplot(
+                hdi_prob, mult, ridgeplot_kind
+            ):
                 if alpha == 0:
                     border = color
                     facecolor = "None"
                 else:
                     border = "k"
-                    facecolor = to_rgba(color, alpha)
                 if x.dtype.kind == "i":
+                    if ridgeplot_truncate:
+                        facecolor = to_rgba(color, alpha)
+                        y_max = y_max[(x >= hdi_[0]) & (x <= hdi_[1])]
+                        x = x[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    else:
+                        facecolor = [
+                            to_rgba(color, alpha) if ci else "None"
+                            for ci in ((x >= hdi_[0]) & (x <= hdi_[1]))
+                        ]
+                    y_min = np.ones_like(x) * y_min
                     ax.bar(
                         x,
                         y_max - y_min,
                         bottom=y_min,
                         linewidth=linewidth,
                         ec=border,
-                        fc=facecolor,
+                        color=facecolor,
+                        alpha=None,
                         zorder=zorder,
                     )
                 else:
-                    if ridgeplot_quantiles is not None:
-                        idx = [np.sum(y_q < quant) for quant in ridgeplot_quantiles]
-                        ax.fill_between(
-                            x,
-                            y_min,
-                            y_max,
-                            where=np.isin(x, x[idx], invert=True, assume_unique=True),
-                            alpha=alpha,
-                            color=color,
-                            zorder=zorder,
+                    tr_x = x[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    tr_y_min = np.ones_like(tr_x) * y_min
+                    tr_y_max = y_max[(x >= hdi_[0]) & (x <= hdi_[1])]
+                    y_min = np.ones_like(x) * y_min
+                    if ridgeplot_truncate:
+                        ax.plot(
+                            tr_x, tr_y_max, "-", linewidth=linewidth, color=border, zorder=zorder
+                        )
+                        ax.plot(
+                            tr_x, tr_y_min, "-", linewidth=linewidth, color=border, zorder=zorder
                         )
                     else:
                         ax.plot(x, y_max, "-", linewidth=linewidth, color=border, zorder=zorder)
                         ax.plot(x, y_min, "-", linewidth=linewidth, color=border, zorder=zorder)
-                        ax.fill_between(x, y_min, y_max, alpha=alpha, color=color, zorder=zorder)
+                    ax.fill_between(
+                        tr_x, tr_y_max, tr_y_min, alpha=alpha, color=color, zorder=zorder
+                    )
+
+                if ridgeplot_quantiles is not None:
+                    quantiles = [x[np.sum(y_q < quant)] for quant in ridgeplot_quantiles]
+                    ax.plot(
+                        quantiles,
+                        np.ones_like(quantiles) * y_min[0],
+                        "d",
+                        mfc=border,
+                        mec=border,
+                        ms=markersize,
+                    )
                 zorder -= 1
         return ax
 
@@ -301,7 +347,7 @@ def forestplot(
         Parameters
         ----------
         hdi_prob : float
-            How wide each line should be
+            Probability for the highest density interval. Width of each line.
         quartiles : bool
             Whether to mark quartiles
         xt_textsize : float
@@ -498,37 +544,41 @@ def treeplot(self, qlist, hdi_prob):
             ntiles[0], ntiles[-1] = hdi(values.flatten(), hdi_prob, multimodal=False)
             yield y, label, ntiles, color
 
-    def ridgeplot(self, mult, ridgeplot_kind):
+    def ridgeplot(self, hdi_prob, mult, ridgeplot_kind):
         """Get data for each ridgeplot for the variable."""
-        xvals, yvals, pdfs, pdfs_q, colors = [], [], [], [], []
+        xvals, hdi_vals, yvals, pdfs, pdfs_q, colors = [], [], [], [], [], []
         for y, *_, values, color in self.iterator():
             yvals.append(y)
             colors.append(color)
             values = values.flatten()
             values = values[np.isfinite(values)]
 
+            if hdi_prob != 1:
+                hdi_ = hdi(values, hdi_prob, multimodal=False)
+            else:
+                hdi_ = min(values), max(values)
+
             if ridgeplot_kind == "auto":
                 kind = "hist" if np.all(np.mod(values, 1) == 0) else "density"
             else:
                 kind = ridgeplot_kind
 
             if kind == "hist":
-                bins = get_bins(values)
-                _, density, x = histogram(values, bins=bins)
-                density_q = density.cumsum() / density.sum()
+                _, density, x = histogram(values, bins=get_bins(values))
                 x = x[:-1]
             elif kind == "density":
                 x, density = kde(values)
-                density_q = density.cumsum() / density.sum()
+
+            density_q = density.cumsum() / density.sum()
 
             xvals.append(x)
             pdfs.append(density)
-            pdfs_q.append((density_q))
+            pdfs_q.append(density_q)
+            hdi_vals.append(hdi_)
 
         scaling = max(np.max(j) for j in pdfs)
-        for y, x, pdf, pdf_q, color in zip(yvals, xvals, pdfs, pdfs_q, colors):
-            y = y * np.ones_like(x)
-            yield x, y, mult * pdf / scaling + y, pdf_q, color
+        for y, x, hdi_val, pdf, pdf_q, color in zip(yvals, xvals, hdi_vals, pdfs, pdfs_q, colors):
+            yield x, y, mult * pdf / scaling + y, hdi_val, pdf_q, color
 
     def ess(self):
         """Get effective n data for the variable."""
diff --git a/arviz/plots/forestplot.py b/arviz/plots/forestplot.py
--- a/arviz/plots/forestplot.py
+++ b/arviz/plots/forestplot.py
@@ -26,6 +26,7 @@ def plot_forest(
     ridgeplot_alpha=None,
     ridgeplot_overlap=2,
     ridgeplot_kind="auto",
+    ridgeplot_truncate=True,
     ridgeplot_quantiles=None,
     figsize=None,
     ax=None,
@@ -37,8 +38,7 @@ def plot_forest(
 ):
     """Forest plot to compare HDI intervals from a number of distributions.
 
-    Generates a forest plot of 100*(hdi_prob)% HDI intervals from
-    a trace or list of traces.
+    Generates a forest plot of 100*(hdi_prob)% HDI intervals from a trace or list of traces.
 
     Parameters
     ----------
@@ -48,30 +48,28 @@ def plot_forest(
     kind: str
         Choose kind of plot for main axis. Supports "forestplot" or "ridgeplot"
     model_names: list[str], optional
-        List with names for the models in the list of data. Useful when
-        plotting more that one dataset
+        List with names for the models in the list of data. Useful when plotting more that one
+        dataset
     var_names: list[str], optional
-        List of variables to plot (defaults to None, which results in all
-        variables plotted) Prefix the variables by `~` when you want to exclude them
-        from the plot.
+        List of variables to plot (defaults to None, which results in all variables plotted)
+        Prefix the variables by `~` when you want to exclude them from the plot.
     filter_vars: {None, "like", "regex"}, optional, default=None
-        If `None` (default), interpret var_names as the real variables names. If "like",
-        interpret var_names as substrings of the real variables names. If "regex",
-        interpret var_names as regular expressions on the real variables names. A la
-        `pandas.filter`.
+        If `None` (default), interpret var_names as the real variables names. If "like", interpret
+        var_names as substrings of the real variables names. If "regex", interpret var_names as
+        regular expressions on the real variables names. A la `pandas.filter`.
     transform: callable
         Function to transform data (defaults to None i.e.the identity function)
     coords: dict, optional
         Coordinates of var_names to be plotted. Passed to `Dataset.sel`
     combined: bool
-        Flag for combining multiple chains into a single chain. If False (default),
-        chains will be plotted separately.
+        Flag for combining multiple chains into a single chain. If False (default), chains will be
+        plotted separately.
     hdi_prob: float, optional
         Plots highest posterior density interval for chosen percentage of density. Defaults to 0.94.
     rope: tuple or dictionary of tuples
-        Lower and upper values of the Region Of Practical Equivalence. If a list with one
-        interval only is provided, the ROPE will be displayed across the y-axis. If more than one
-        interval is provided the length of the list should match the number of variables.
+        Lower and upper values of the Region Of Practical Equivalence. If a list with one interval
+        only is provided, the ROPE will be displayed across the y-axis. If more than one interval is
+        provided the length of the list should match the number of variables.
     quartiles: bool, optional
         Flag for plotting the interquartile range, in addition to the hdi_prob intervals.
         Defaults to True
@@ -81,9 +79,9 @@ def plot_forest(
         Flag for plotting the effective sample size. Defaults to False
     colors: list or string, optional
         list with valid matplotlib colors, one color per model. Alternative a string can be passed.
-        If the string is `cycle`, it will automatically chose a color per model from the
-        matplotlibs cycle. If a single color is passed, eg 'k', 'C2', 'red' this color will be used
-        for all models. Defauls to 'cycle'.
+        If the string is `cycle`, it will automatically chose a color per model from the matplotlibs
+        cycle. If a single color is passed, eg 'k', 'C2', 'red' this color will be used for all
+        models. Defauls to 'cycle'.
     textsize: float
         Text size scaling factor for labels, titles and lines. If None it will be autoscaled based
         on figsize.
@@ -99,6 +97,8 @@ def plot_forest(
     ridgeplot_kind: string
         By default ("auto") continuous variables are plotted using KDEs and discrete ones using
         histograms. To override this use "hist" to plot histograms and "density" for KDEs
+    ridgeplot_truncate: bool
+        Whether to truncate densities according to the value of hdi_prop. Defaults to True
     ridgeplot_quantiles: list
         Quantiles in ascending order used to segment the KDE. Use [.25, .5, .75] for quartiles.
         Defaults to None.
@@ -153,6 +153,22 @@ def plot_forest(
         >>>                            colors='white',
         >>>                            figsize=(9, 7))
         >>> axes[0].set_title('Estimated theta for 8 schools model')
+
+    Ridgeplot non-truncated and with quantiles
+
+    .. plot::
+        :context: close-figs
+
+        >>> axes = az.plot_forest(non_centered_data,
+        >>>                            kind='ridgeplot',
+        >>>                            var_names=['theta'],
+        >>>                            combined=True,
+        >>>                            ridgeplot_truncate=False,
+        >>>                            ridgeplot_quantiles=[.25, .5, .75],
+        >>>                            ridgeplot_overlap=0.7,
+        >>>                            colors='white',
+        >>>                            figsize=(9, 7))
+        >>> axes[0].set_title('Estimated theta for 8 schools model')
     """
     if credible_interval:
         hdi_prob = credible_interval_warning(credible_interval, hdi_prob)
@@ -207,6 +223,7 @@ def plot_forest(
         ridgeplot_overlap=ridgeplot_overlap,
         ridgeplot_alpha=ridgeplot_alpha,
         ridgeplot_kind=ridgeplot_kind,
+        ridgeplot_truncate=ridgeplot_truncate,
         ridgeplot_quantiles=ridgeplot_quantiles,
         textsize=textsize,
         ess=ess,


Test patch:
diff --git a/arviz/tests/base_tests/test_plots_bokeh.py b/arviz/tests/base_tests/test_plots_bokeh.py
--- a/arviz/tests/base_tests/test_plots_bokeh.py
+++ b/arviz/tests/base_tests/test_plots_bokeh.py
@@ -450,6 +450,14 @@ def test_plot_ess_no_divergences(models):
         ({"var_names": "mu", "rope": (-1, 1)}, 1),
         ({"r_hat": True, "quartiles": False}, 2),
         ({"var_names": ["mu"], "colors": "black", "ess": True, "combined": True}, 2),
+        (
+            {
+                "kind": "ridgeplot",
+                "ridgeplot_truncate": False,
+                "ridgeplot_quantiles": [0.25, 0.5, 0.75],
+            },
+            1,
+        ),
         ({"kind": "ridgeplot", "r_hat": True, "ess": True}, 3),
         ({"kind": "ridgeplot", "r_hat": True, "ess": True, "ridgeplot_alpha": 0}, 3),
         (
diff --git a/arviz/tests/base_tests/test_plots_matplotlib.py b/arviz/tests/base_tests/test_plots_matplotlib.py
--- a/arviz/tests/base_tests/test_plots_matplotlib.py
+++ b/arviz/tests/base_tests/test_plots_matplotlib.py
@@ -237,6 +237,15 @@ def test_plot_trace_futurewarning(models, prop):
         ({"var_names": "mu", "rope": (-1, 1)}, 1),
         ({"r_hat": True, "quartiles": False}, 2),
         ({"var_names": ["mu"], "colors": "C0", "ess": True, "combined": True}, 2),
+        (
+            {
+                "kind": "ridgeplot",
+                "ridgeplot_truncate": False,
+                "ridgeplot_quantiles": [0.25, 0.5, 0.75],
+            },
+            1,
+        ),
+        ({"kind": "ridgeplot", "r_hat": True, "ess": True}, 3),
         ({"kind": "ridgeplot", "r_hat": True, "ess": True}, 3),
         ({"kind": "ridgeplot", "r_hat": True, "ess": True, "ridgeplot_alpha": 0}, 3),
         (