diff --git a/NAMESPACE b/NAMESPACE
index b8cf818b..101a6ccd 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -217,12 +217,11 @@ importFrom(dplyr,inner_join)
importFrom(dplyr,left_join)
importFrom(dplyr,mutate)
importFrom(dplyr,n)
-importFrom(dplyr,one_of)
importFrom(dplyr,pull)
importFrom(dplyr,rename)
importFrom(dplyr,select)
+importFrom(dplyr,slice_min)
importFrom(dplyr,summarise)
-importFrom(dplyr,top_n)
importFrom(dplyr,ungroup)
importFrom(dplyr,vars)
importFrom(ggplot2,"%+replace%")
diff --git a/NEWS.md b/NEWS.md
index b3e8922c..b4763452 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,9 @@
# bayesplot (development version)
+* Replaced deprecated `dplyr` and `tidyselect` functions (`top_n`, `one_of`, `group_indices`) with their modern equivalents to ensure future compatibility. (#431)
+* New "Example Gallery" vignette providing a visual overview of all plotting
+ functions with thumbnail example plots, organized by category (PPC, PPD, MCMC,
+ HMC/NUTS). (#437)
* Documentation added for all exported `*_data()` functions (#209)
* Improved documentation for `binwidth`, `bins`, and `breaks` arguments to clarify they are passed to `ggplot2::geom_area()` and `ggdist::stat_dots()` in addition to `ggplot2::geom_histogram()`
* Improved documentation for `freq` argument to clarify it applies to frequency polygons in addition to histograms
diff --git a/R/mcmc-intervals.R b/R/mcmc-intervals.R
index 1ab9298a..14010769 100644
--- a/R/mcmc-intervals.R
+++ b/R/mcmc-intervals.R
@@ -647,7 +647,7 @@ mcmc_intervals_data <- function(x,
rhat_tbl <- rhat %>%
mcmc_rhat_data() %>%
- select(one_of("parameter"),
+ select(all_of("parameter"),
rhat_value = "value",
rhat_rating = "rating",
rhat_description = "description") %>%
@@ -663,7 +663,7 @@ mcmc_intervals_data <- function(x,
# Don't import `filter`: otherwise, you get a warning when using
# `devtools::load_all(".")` because stats also has a `filter` function
-#' @importFrom dplyr inner_join one_of top_n
+#' @importFrom dplyr inner_join all_of slice_min
#' @rdname MCMC-intervals
#' @export
mcmc_areas_data <- function(x,
@@ -736,14 +736,14 @@ mcmc_areas_data <- function(x,
# Find the density values closest to the point estimate
point_ests <- intervals %>%
- select(one_of("parameter", "m"))
+ select(all_of(c("parameter", "m")))
point_centers <- data_inner %>%
inner_join(point_ests, by = "parameter") %>%
group_by(.data$parameter) %>%
mutate(diff = abs(.data$m - .data$x)) %>%
- dplyr::top_n(1, -.data$diff) %>%
- select(one_of("parameter", "x", "m")) %>%
+ dplyr::slice_min(.data$diff, n = 1) %>%
+ select(all_of(c("parameter", "x", "m"))) %>%
rename(center = "x") %>%
ungroup()
@@ -765,15 +765,15 @@ mcmc_areas_data <- function(x,
}
data <- dplyr::bind_rows(data_inner, data_outer, points) %>%
- select(one_of("parameter", "interval", "interval_width",
- "x", "density", "scaled_density")) %>%
+ select(all_of(c("parameter", "interval", "interval_width",
+ "x", "density", "scaled_density"))) %>%
# Density scaled so the highest in entire dataframe has height 1
mutate(plotting_density = .data$density / max(.data$density))
if (rlang::has_name(intervals, "rhat_value")) {
rhat_info <- intervals %>%
- select(one_of("parameter", "rhat_value",
- "rhat_rating", "rhat_description"))
+ select(all_of(c("parameter", "rhat_value",
+ "rhat_rating", "rhat_description")))
data <- inner_join(data, rhat_info, by = "parameter")
}
data
@@ -824,18 +824,15 @@ compute_column_density <- function(df, group_vars, value_var, ...) {
syms()
# Tuck away the subgroups to compute densities on into nested dataframes
- sub_df <- dplyr::select(df, !!! group_cols, !! value_var)
-
group_df <- df %>%
dplyr::select(!!! group_cols, !! value_var) %>%
group_by(!!! group_cols)
by_group <- group_df %>%
- split(dplyr::group_indices(group_df)) %>%
+ dplyr::group_split() %>%
lapply(pull, !! value_var)
- nested <- df %>%
- dplyr::distinct(!!! group_cols) %>%
+ nested <- dplyr::group_keys(group_df) %>%
mutate(data = by_group)
nested$density <- lapply(nested$data, compute_interval_density, ...)
diff --git a/_pkgdown.yml b/_pkgdown.yml
index 4388eb8c..7161176f 100644
--- a/_pkgdown.yml
+++ b/_pkgdown.yml
@@ -12,10 +12,13 @@ navbar:
title: "bayesplot"
structure:
- left: [home, vignettes, functions, news, pkgs, stan]
+ left: [home, gallery, vignettes, functions, news, pkgs, stan]
right: [search, bluesky, forum, github, lightswitch]
components:
+ gallery:
+ text: Gallery
+ href: articles/example-gallery.html
pkgs:
text: Other Packages
menu:
@@ -37,6 +40,12 @@ navbar:
href: https://mc-stan.org/shinystan
articles:
+ - title: "Example Gallery"
+ desc: >
+ A visual overview of all plotting functions available in **bayesplot**,
+ organized by category with thumbnail example plots.
+ contents:
+ - example-gallery
- title: "Getting Started"
desc: >
These vignettes provide an introduction to visualizing MCMC draws and
diff --git a/vignettes/example-gallery.Rmd b/vignettes/example-gallery.Rmd
new file mode 100644
index 00000000..ae025198
--- /dev/null
+++ b/vignettes/example-gallery.Rmd
@@ -0,0 +1,1109 @@
+---
+title: "Example Gallery"
+author: "bayesplot team"
+date: "`r Sys.Date()`"
+output:
+ rmarkdown::html_vignette:
+ toc: true
+ toc_depth: 2
+params:
+ EVAL: !r identical(Sys.getenv("NOT_CRAN"), "true")
+vignette: >
+ %\VignetteIndexEntry{Example gallery}
+ %\VignetteEngine{knitr::rmarkdown}
+ %\VignetteEncoding{UTF-8}
+---
+
+```{r setup, include=FALSE}
+stopifnot(require("knitr"))
+library("bayesplot")
+library("ggplot2")
+
+knitr::opts_chunk$set(
+ dev = "png",
+ dpi = 96,
+ fig.width = 3.5,
+ fig.height = 2.8,
+ out.width = "100%",
+ fig.align = "center",
+ comment = NA,
+ eval = if (isTRUE(exists("params"))) params$EVAL else FALSE,
+ message = FALSE,
+ warning = FALSE
+)
+
+bayesplot_theme_set(theme_default(base_size = 8))
+color_scheme_set("brightblue")
+set.seed(8420)
+
+# Prepare shared example data
+y <- example_y_data()
+yrep <- example_yrep_draws()
+x <- example_x_data()
+group <- example_group_data()
+draws <- example_mcmc_draws(params = 6)
+```
+
+```{r gallery-helpers, echo=FALSE}
+# Base URL for reference pages
+ref_base <- "https://mc-stan.org/bayesplot/reference/"
+
+# Helper: emit one gallery card (clickable thumbnail + linked label)
+gallery_card <- function(chunk_label, ref_page, fn_name) {
+ url <- paste0(ref_base, ref_page)
+ cat('
\n')
+}
+
+# Helper for conditional cards (e.g. requiring optional packages)
+gallery_card_cond <- function(chunk_label, ref_page, fn_name, condition,
+ fallback = "Requires survival package") {
+ url <- paste0(ref_base, ref_page)
+ cat('\n')
+}
+```
+
+```{css gallery-styles, echo=FALSE}
+/* ---- Gallery grid layout ---- */
+.gallery-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 1.2em;
+ margin-bottom: 2em;
+}
+.gallery-card {
+ border: 1px solid #ddd;
+ border-radius: 6px;
+ overflow: hidden;
+ background: #fff;
+ transition: box-shadow 0.2s;
+}
+.gallery-card:hover {
+ box-shadow: 0 2px 12px rgba(0,0,0,0.12);
+}
+.gallery-card img {
+ width: 100%;
+ display: block;
+}
+.gallery-card .card-label {
+ padding: 0.5em 0.75em;
+ font-family: 'SFMono-Regular', 'Menlo', monospace;
+ font-size: 0.85em;
+ text-align: center;
+ border-top: 1px solid #eee;
+}
+.gallery-card .card-label a {
+ color: #2171b5;
+ text-decoration: none;
+}
+.gallery-card .card-label a:hover {
+ text-decoration: underline;
+}
+
+/* make the vignette wider for the gallery layout */
+.main-container {
+ max-width: 960px !important;
+}
+```
+
+This gallery provides a visual overview of all the plotting functions available
+in the **bayesplot** package, organized by category. Click on any function name
+to see its full documentation.
+
+> **See also:** The
+> [Plotting MCMC draws](plotting-mcmc-draws.html),
+> [Visual MCMC diagnostics](visual-mcmc-diagnostics.html), and
+> [Graphical PPCs](graphical-ppcs.html) vignettes provide in-depth tutorials.
+
+
+# PPC: Posterior Predictive Checks {#ppc}
+
+Plotting functions for graphical posterior predictive checks, comparing
+observed data `y` to simulated data `yrep` from the posterior predictive
+distribution. See `help("PPC-overview")` for details.
+
+## Distributions {#ppc-distributions}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_hist, echo=FALSE, fig.show='hide'}
+p <- ppc_hist(y, yrep[1:5, ])
+print(p)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_hist", "PPC-distributions.html", "ppc_hist")
+```
+
+```{r ppc_dens, echo=FALSE, fig.show='hide'}
+ppc_dens(y, yrep[200:202, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_dens", "PPC-distributions.html", "ppc_dens")
+```
+
+```{r ppc_dens_overlay, echo=FALSE, fig.show='hide'}
+ppc_dens_overlay(y, yrep[1:25, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_dens_overlay", "PPC-distributions.html", "ppc_dens_overlay")
+```
+
+```{r ppc_ecdf_overlay, echo=FALSE, fig.show='hide'}
+ppc_ecdf_overlay(y, yrep[sample(nrow(yrep), 25), ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_ecdf_overlay", "PPC-distributions.html", "ppc_ecdf_overlay")
+```
+
+```{r ppc_freqpoly, echo=FALSE, fig.show='hide'}
+ppc_freqpoly(y, yrep[1:3, ], alpha = 0.1, size = 1)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_freqpoly", "PPC-distributions.html", "ppc_freqpoly")
+```
+
+```{r ppc_freqpoly_grouped, echo=FALSE, fig.show='hide'}
+ppc_freqpoly_grouped(y, yrep[1:3, ], group, freq = FALSE)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_freqpoly_grouped", "PPC-distributions.html", "ppc_freqpoly_grouped")
+```
+
+```{r ppc_boxplot, echo=FALSE, fig.show='hide'}
+ppc_boxplot(y, yrep[1:8, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_boxplot", "PPC-distributions.html", "ppc_boxplot")
+```
+
+```{r ppc_violin_grouped, echo=FALSE, fig.show='hide'}
+ppc_violin_grouped(y, yrep, group, size = 1.5)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_violin_grouped", "PPC-distributions.html", "ppc_violin_grouped")
+```
+
+```{r ppc_dens_overlay_grouped, echo=FALSE, fig.show='hide'}
+ppc_dens_overlay_grouped(y, yrep[1:25, ], group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_dens_overlay_grouped", "PPC-distributions.html", "ppc_dens_overlay_grouped")
+```
+
+```{r ppc_ecdf_overlay_grouped, echo=FALSE, fig.show='hide'}
+ppc_ecdf_overlay_grouped(y, yrep[1:25, ], group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_ecdf_overlay_grouped", "PPC-distributions.html", "ppc_ecdf_overlay_grouped")
+```
+
+```{r ppc_pit_ecdf, echo=FALSE, fig.show='hide'}
+ppc_pit_ecdf(y, yrep, prob = 0.99, plot_diff = FALSE)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_pit_ecdf", "PPC-distributions.html", "ppc_pit_ecdf")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Test Statistics {#ppc-test-statistics}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_stat, echo=FALSE, fig.show='hide'}
+ppc_stat(y, yrep, stat = "mean")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_stat", "PPC-test-statistics.html", "ppc_stat")
+```
+
+```{r ppc_stat_2d, echo=FALSE, fig.show='hide'}
+ppc_stat_2d(y, yrep, stat = c("mean", "sd"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_stat_2d", "PPC-test-statistics.html", "ppc_stat_2d")
+```
+
+```{r ppc_stat_grouped, echo=FALSE, fig.show='hide'}
+ppc_stat_grouped(y, yrep, group = group, stat = "median")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_stat_grouped", "PPC-test-statistics.html", "ppc_stat_grouped")
+```
+
+```{r ppc_stat_freqpoly, echo=FALSE, fig.show='hide'}
+ppc_stat_freqpoly(y, yrep, stat = "mean")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_stat_freqpoly", "PPC-test-statistics.html", "ppc_stat_freqpoly")
+```
+
+```{r ppc_stat_freqpoly_grouped, echo=FALSE, fig.show='hide'}
+ppc_stat_freqpoly_grouped(y, yrep, group = group, stat = "median")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_stat_freqpoly_grouped", "PPC-test-statistics.html", "ppc_stat_freqpoly_grouped")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Intervals {#ppc-intervals}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_intervals, echo=FALSE, fig.show='hide'}
+ppc_intervals(y, yrep, x = x)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_intervals", "PPC-intervals.html", "ppc_intervals")
+```
+
+```{r ppc_ribbon, echo=FALSE, fig.show='hide'}
+ppc_ribbon(y, yrep, x = x)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_ribbon", "PPC-intervals.html", "ppc_ribbon")
+```
+
+```{r ppc_intervals_grouped, echo=FALSE, fig.show='hide'}
+ppc_intervals_grouped(y, yrep, x = x, group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_intervals_grouped", "PPC-intervals.html", "ppc_intervals_grouped")
+```
+
+```{r ppc_ribbon_grouped, echo=FALSE, fig.show='hide'}
+ppc_ribbon_grouped(y, yrep, x = x, group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_ribbon_grouped", "PPC-intervals.html", "ppc_ribbon_grouped")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Scatterplots {#ppc-scatterplots}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_scatter, echo=FALSE, fig.show='hide'}
+ppc_scatter(y, yrep[1:3, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_scatter", "PPC-scatterplots.html", "ppc_scatter")
+```
+
+```{r ppc_scatter_avg, echo=FALSE, fig.show='hide'}
+ppc_scatter_avg(y, yrep)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_scatter_avg", "PPC-scatterplots.html", "ppc_scatter_avg")
+```
+
+```{r ppc_scatter_avg_grouped, echo=FALSE, fig.show='hide'}
+ppc_scatter_avg_grouped(y, yrep, group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_scatter_avg_grouped", "PPC-scatterplots.html", "ppc_scatter_avg_grouped")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Errors {#ppc-errors}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_error_hist, echo=FALSE, fig.show='hide'}
+ppc_error_hist(y, yrep[1:3, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_hist", "PPC-errors.html", "ppc_error_hist")
+```
+
+```{r ppc_error_hist_grouped, echo=FALSE, fig.show='hide'}
+ppc_error_hist_grouped(y, yrep[1:3, ], group = group)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_hist_grouped", "PPC-errors.html", "ppc_error_hist_grouped")
+```
+
+```{r ppc_error_scatter, echo=FALSE, fig.show='hide'}
+ppc_error_scatter(y, yrep[1:3, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_scatter", "PPC-errors.html", "ppc_error_scatter")
+```
+
+```{r ppc_error_scatter_avg, echo=FALSE, fig.show='hide'}
+ppc_error_scatter_avg(y, yrep)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_scatter_avg", "PPC-errors.html", "ppc_error_scatter_avg")
+```
+
+```{r ppc_error_scatter_avg_vs_x, echo=FALSE, fig.show='hide'}
+ppc_error_scatter_avg_vs_x(y, yrep, x = x)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_scatter_avg_vs_x", "PPC-errors.html", "ppc_error_scatter_avg_vs_x")
+```
+
+```{r ppc_error_binned, echo=FALSE, fig.show='hide'}
+ppc_error_binned(y, yrep[1:3, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_error_binned", "PPC-errors.html", "ppc_error_binned")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Discrete {#ppc-discrete}
+
+```{r setup-discrete, echo=FALSE}
+# Create simple discrete data for these plots
+set.seed(123)
+y_disc <- rpois(200, lambda = 3)
+yrep_disc <- matrix(rpois(200 * 100, lambda = 3), nrow = 100)
+group_disc <- factor(rep(c("A", "B"), each = 100))
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_bars, echo=FALSE, fig.show='hide'}
+ppc_bars(y_disc, yrep_disc[1:50, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_bars", "PPC-discrete.html", "ppc_bars")
+```
+
+```{r ppc_bars_grouped, echo=FALSE, fig.show='hide'}
+ppc_bars_grouped(y_disc, yrep_disc[1:50, ], group = group_disc)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_bars_grouped", "PPC-discrete.html", "ppc_bars_grouped")
+```
+
+```{r ppc_rootogram, echo=FALSE, fig.show='hide'}
+ppc_rootogram(y_disc, yrep_disc)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_rootogram", "PPC-discrete.html", "ppc_rootogram")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## LOO Predictive Checks {#ppc-loo}
+
+```{r setup-loo, echo=FALSE}
+# Pre-compute PIT values and LOO intervals for these plots
+# (avoids needing the loo and rstantools packages)
+set.seed(456)
+pit_vals <- runif(length(y)) # simulated PIT values for demonstration
+
+# Pre-computed LOO predictive intervals (5 columns: ll, l, m, h, hh)
+loo_intervals <- cbind(
+ ll = apply(yrep, 2, quantile, probs = 0.05),
+ l = apply(yrep, 2, quantile, probs = 0.25),
+ m = apply(yrep, 2, quantile, probs = 0.50),
+ h = apply(yrep, 2, quantile, probs = 0.75),
+ hh = apply(yrep, 2, quantile, probs = 0.95)
+)
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_loo_pit_overlay, echo=FALSE, fig.show='hide'}
+ppc_loo_pit_overlay(y, yrep, pit = pit_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_loo_pit_overlay", "PPC-loo.html", "ppc_loo_pit_overlay")
+```
+
+```{r ppc_loo_pit_qq, echo=FALSE, fig.show='hide'}
+ppc_loo_pit_qq(y, yrep, pit = pit_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_loo_pit_qq", "PPC-loo.html", "ppc_loo_pit_qq")
+```
+
+```{r ppc_loo_intervals, echo=FALSE, fig.show='hide'}
+ppc_loo_intervals(y, yrep, intervals = loo_intervals, order = "median")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_loo_intervals", "PPC-loo.html", "ppc_loo_intervals")
+```
+
+```{r ppc_loo_ribbon, echo=FALSE, fig.show='hide'}
+ppc_loo_ribbon(y, yrep, intervals = loo_intervals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppc_loo_ribbon", "PPC-loo.html", "ppc_loo_ribbon")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Censoring {#ppc-censoring}
+
+```{r setup-censoring, echo=FALSE}
+# Create survival-type data for censoring plots
+has_survival <- requireNamespace("survival", quietly = TRUE)
+if (has_survival) {
+ set.seed(789)
+ n_cens <- 100
+ y_cens <- rexp(n_cens, rate = 0.5)
+ status_cens <- rbinom(n_cens, 1, prob = 0.7)
+ y_cens[status_cens == 0] <- runif(sum(status_cens == 0), 0, y_cens[status_cens == 0])
+ yrep_cens <- matrix(rexp(n_cens * 50, rate = 0.5), nrow = 50)
+ group_cens <- factor(rep(c("A", "B"), each = n_cens / 2))
+}
+has_survival <- requireNamespace("survival", quietly = TRUE)
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppc_km_overlay, echo=FALSE, fig.show='hide', eval=has_survival}
+ppc_km_overlay(y_cens, yrep_cens, status_y = status_cens)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card_cond("ppc_km_overlay", "PPC-censoring.html", "ppc_km_overlay", has_survival)
+```
+
+```{r ppc_km_overlay_grouped, echo=FALSE, fig.show='hide', eval=has_survival}
+ppc_km_overlay_grouped(y_cens, yrep_cens, status_y = status_cens, group = group_cens)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card_cond("ppc_km_overlay_grouped", "PPC-censoring.html", "ppc_km_overlay_grouped", has_survival)
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+
+# PPD: Posterior/Prior Predictive Distributions {#ppd}
+
+Plots of posterior (or prior) predictive distributions *without*
+comparing to observed data. These are the counterparts of the PPC
+functions above but take only `ypred` rather than both `y` and `yrep`.
+See `help("PPD-overview")` for details.
+
+## Distributions {#ppd-distributions}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppd_hist, echo=FALSE, fig.show='hide'}
+ppd_hist(yrep[1:5, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_hist", "PPD-distributions.html", "ppd_hist")
+```
+
+```{r ppd_dens_overlay, echo=FALSE, fig.show='hide'}
+ppd_dens_overlay(yrep[1:25, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_dens_overlay", "PPD-distributions.html", "ppd_dens_overlay")
+```
+
+```{r ppd_ecdf_overlay, echo=FALSE, fig.show='hide'}
+ppd_ecdf_overlay(yrep[1:25, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_ecdf_overlay", "PPD-distributions.html", "ppd_ecdf_overlay")
+```
+
+```{r ppd_dens, echo=FALSE, fig.show='hide'}
+ppd_dens(yrep[200:202, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_dens", "PPD-distributions.html", "ppd_dens")
+```
+
+```{r ppd_freqpoly, echo=FALSE, fig.show='hide'}
+ppd_freqpoly(yrep[1:3, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_freqpoly", "PPD-distributions.html", "ppd_freqpoly")
+```
+
+```{r ppd_boxplot, echo=FALSE, fig.show='hide'}
+ppd_boxplot(yrep[1:8, ])
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_boxplot", "PPD-distributions.html", "ppd_boxplot")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Intervals {#ppd-intervals}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppd_intervals, echo=FALSE, fig.show='hide'}
+ppd_intervals(yrep, x = x)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_intervals", "PPD-intervals.html", "ppd_intervals")
+```
+
+```{r ppd_ribbon, echo=FALSE, fig.show='hide'}
+ppd_ribbon(yrep, x = x)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_ribbon", "PPD-intervals.html", "ppd_ribbon")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Test Statistics {#ppd-test-statistics}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r ppd_stat, echo=FALSE, fig.show='hide'}
+ppd_stat(yrep, stat = "mean")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_stat", "PPD-test-statistics.html", "ppd_stat")
+```
+
+```{r ppd_stat_grouped, echo=FALSE, fig.show='hide'}
+ppd_stat_grouped(yrep, group = group, stat = "median")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_stat_grouped", "PPD-test-statistics.html", "ppd_stat_grouped")
+```
+
+```{r ppd_stat_freqpoly, echo=FALSE, fig.show='hide'}
+ppd_stat_freqpoly(yrep, stat = "mean")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_stat_freqpoly", "PPD-test-statistics.html", "ppd_stat_freqpoly")
+```
+
+```{r ppd_stat_2d, echo=FALSE, fig.show='hide'}
+ppd_stat_2d(yrep, stat = c("mean", "sd"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("ppd_stat_2d", "PPD-test-statistics.html", "ppd_stat_2d")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+
+# MCMC: Markov Chain Monte Carlo {#mcmc}
+
+Plotting functions for MCMC draws and diagnostics.
+See `help("MCMC-overview")` for details.
+
+## Intervals & Areas {#mcmc-intervals}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_intervals, echo=FALSE, fig.show='hide'}
+mcmc_intervals(draws)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_intervals", "MCMC-intervals.html", "mcmc_intervals")
+```
+
+```{r mcmc_areas, echo=FALSE, fig.show='hide'}
+mcmc_areas(draws, prob = 0.8)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_areas", "MCMC-intervals.html", "mcmc_areas")
+```
+
+```{r mcmc_areas_ridges, echo=FALSE, fig.show='hide'}
+mcmc_areas_ridges(draws)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_areas_ridges", "MCMC-intervals.html", "mcmc_areas_ridges")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Distributions {#mcmc-distributions}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_hist, echo=FALSE, fig.show='hide'}
+mcmc_hist(draws)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_hist", "MCMC-distributions.html", "mcmc_hist")
+```
+
+```{r mcmc_hist_by_chain, echo=FALSE, fig.show='hide'}
+mcmc_hist_by_chain(draws, pars = "alpha")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_hist_by_chain", "MCMC-distributions.html", "mcmc_hist_by_chain")
+```
+
+```{r mcmc_dens, echo=FALSE, fig.show='hide'}
+mcmc_dens(draws)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_dens", "MCMC-distributions.html", "mcmc_dens")
+```
+
+```{r mcmc_dens_overlay, echo=FALSE, fig.show='hide'}
+mcmc_dens_overlay(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_dens_overlay", "MCMC-distributions.html", "mcmc_dens_overlay")
+```
+
+```{r mcmc_dens_chains, echo=FALSE, fig.show='hide'}
+mcmc_dens_chains(draws, pars = "alpha")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_dens_chains", "MCMC-distributions.html", "mcmc_dens_chains")
+```
+
+```{r mcmc_violin, echo=FALSE, fig.show='hide'}
+mcmc_violin(draws)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_violin", "MCMC-distributions.html", "mcmc_violin")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Traces & Rank Plots {#mcmc-traces}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_trace, echo=FALSE, fig.show='hide'}
+color_scheme_set("mix-blue-red")
+mcmc_trace(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_trace", "MCMC-traces.html", "mcmc_trace")
+```
+
+```{r mcmc_trace_highlight, echo=FALSE, fig.show='hide'}
+mcmc_trace_highlight(draws, pars = "alpha", highlight = 1)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_trace_highlight", "MCMC-traces.html", "mcmc_trace_highlight")
+```
+
+```{r mcmc_rank_overlay, echo=FALSE, fig.show='hide'}
+color_scheme_set("brightblue")
+mcmc_rank_overlay(draws, pars = "alpha")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_rank_overlay", "MCMC-traces.html", "mcmc_rank_overlay")
+```
+
+```{r mcmc_rank_hist, echo=FALSE, fig.show='hide'}
+mcmc_rank_hist(draws, pars = "alpha")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_rank_hist", "MCMC-traces.html", "mcmc_rank_hist")
+```
+
+```{r mcmc_rank_ecdf, echo=FALSE, fig.show='hide'}
+mcmc_rank_ecdf(draws, pars = "alpha")
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_rank_ecdf", "MCMC-traces.html", "mcmc_rank_ecdf")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Scatterplots {#mcmc-scatterplots}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_scatter, echo=FALSE, fig.show='hide'}
+color_scheme_set("brightblue")
+mcmc_scatter(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_scatter", "MCMC-scatterplots.html", "mcmc_scatter")
+```
+
+```{r mcmc_hex, echo=FALSE, fig.show='hide'}
+mcmc_hex(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_hex", "MCMC-scatterplots.html", "mcmc_hex")
+```
+
+```{r mcmc_pairs, echo=FALSE, fig.show='hide'}
+mcmc_pairs(draws, pars = c("alpha", "sigma", "beta[1]"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_pairs", "MCMC-scatterplots.html", "mcmc_pairs")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Diagnostics {#mcmc-diagnostics}
+
+```{r setup-diagnostics, echo=FALSE}
+# Create example diagnostic values
+set.seed(321)
+rhat_vals <- c(1.00, 1.01, 1.02, 1.005, 1.08, 1.001)
+names(rhat_vals) <- dimnames(draws)[[3]]
+neff_vals <- c(0.9, 0.8, 0.7, 0.85, 0.5, 0.95)
+names(neff_vals) <- dimnames(draws)[[3]]
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_rhat, echo=FALSE, fig.show='hide'}
+mcmc_rhat(rhat_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_rhat", "MCMC-diagnostics.html", "mcmc_rhat")
+```
+
+```{r mcmc_rhat_hist, echo=FALSE, fig.show='hide'}
+mcmc_rhat_hist(rhat_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_rhat_hist", "MCMC-diagnostics.html", "mcmc_rhat_hist")
+```
+
+```{r mcmc_neff, echo=FALSE, fig.show='hide'}
+mcmc_neff(neff_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_neff", "MCMC-diagnostics.html", "mcmc_neff")
+```
+
+```{r mcmc_neff_hist, echo=FALSE, fig.show='hide'}
+mcmc_neff_hist(neff_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_neff_hist", "MCMC-diagnostics.html", "mcmc_neff_hist")
+```
+
+```{r mcmc_acf, echo=FALSE, fig.show='hide'}
+mcmc_acf(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_acf", "MCMC-diagnostics.html", "mcmc_acf")
+```
+
+```{r mcmc_acf_bar, echo=FALSE, fig.show='hide'}
+mcmc_acf_bar(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_acf_bar", "MCMC-diagnostics.html", "mcmc_acf_bar")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Parallel Coordinates {#mcmc-parcoord}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_parcoord, echo=FALSE, fig.show='hide'}
+mcmc_parcoord(draws, pars = c("alpha", "sigma", "beta[1]", "beta[2]"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_parcoord", "MCMC-parcoord.html", "mcmc_parcoord")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Recovery {#mcmc-recover}
+
+```{r setup-recover, echo=FALSE}
+# Create example "true" parameter values for recovery plots
+true_vals <- c(alpha = 2.5, sigma = 1.2, "beta[1]" = 0.5, "beta[2]" = -0.3,
+ "beta[3]" = 0.8, "beta[4]" = -1.1)
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_recover_intervals, echo=FALSE, fig.show='hide'}
+mcmc_recover_intervals(draws, true = true_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_recover_intervals", "MCMC-recover.html", "mcmc_recover_intervals")
+```
+
+```{r mcmc_recover_scatter, echo=FALSE, fig.show='hide'}
+mcmc_recover_scatter(draws, true = true_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_recover_scatter", "MCMC-recover.html", "mcmc_recover_scatter")
+```
+
+```{r mcmc_recover_hist, echo=FALSE, fig.show='hide'}
+mcmc_recover_hist(draws, true = true_vals)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_recover_hist", "MCMC-recover.html", "mcmc_recover_hist")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+## Combo Plots {#mcmc-combo}
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_combo, echo=FALSE, fig.show='hide', fig.width=4.5, fig.height=4}
+mcmc_combo(draws, pars = c("alpha", "sigma"))
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_combo", "MCMC-combos.html", "mcmc_combo")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```
+
+
+# HMC/NUTS Diagnostics {#nuts}
+
+Diagnostic plots specific to Hamiltonian Monte Carlo (HMC) and the No-U-Turn
+Sampler (NUTS). These functions require NUTS-specific diagnostic information.
+See `help("MCMC-nuts")` for details.
+
+```{r setup-nuts, echo=FALSE}
+# Simulate simple NUTS diagnostic data
+set.seed(654)
+n_iter <- 250
+n_chains <- 4
+np_data <- data.frame(
+ Parameter = rep(c("accept_stat__", "stepsize__", "treedepth__",
+ "n_leapfrog__", "divergent__", "energy__"), each = n_iter * n_chains),
+ Value = c(
+ rbeta(n_iter * n_chains, 20, 1), # accept_stat__
+ rep(c(0.8, 0.9, 0.85, 0.75), each = n_iter), # stepsize__
+ sample(2:6, n_iter * n_chains, replace = TRUE, prob = c(0.05, 0.3, 0.4, 0.2, 0.05)), # treedepth__
+ 2^sample(2:6, n_iter * n_chains, replace = TRUE, prob = c(0.05, 0.3, 0.4, 0.2, 0.05)), # n_leapfrog__
+ rbinom(n_iter * n_chains, 1, 0.02), # divergent__
+ rnorm(n_iter * n_chains, -200, 5) # energy__
+ ),
+ Chain = rep(rep(1:n_chains, each = n_iter), 6),
+ Iteration = rep(rep(1:n_iter, n_chains), 6)
+)
+
+lp_data <- data.frame(
+ Value = rnorm(n_iter * n_chains, -200, 2),
+ Chain = rep(1:n_chains, each = n_iter),
+ Iteration = rep(1:n_iter, n_chains)
+)
+```
+
+```{r results='asis', echo=FALSE}
+cat('\n')
+```
+
+```{r mcmc_nuts_divergence, echo=FALSE, fig.show='hide'}
+mcmc_nuts_divergence(np_data, lp_data)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_nuts_divergence", "MCMC-nuts.html", "mcmc_nuts_divergence")
+```
+
+```{r mcmc_nuts_energy, echo=FALSE, fig.show='hide'}
+mcmc_nuts_energy(np_data)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_nuts_energy", "MCMC-nuts.html", "mcmc_nuts_energy")
+```
+
+```{r mcmc_nuts_acceptance, echo=FALSE, fig.show='hide'}
+mcmc_nuts_acceptance(np_data, lp_data)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_nuts_acceptance", "MCMC-nuts.html", "mcmc_nuts_acceptance")
+```
+
+```{r mcmc_nuts_treedepth, echo=FALSE, fig.show='hide'}
+mcmc_nuts_treedepth(np_data, lp_data)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_nuts_treedepth", "MCMC-nuts.html", "mcmc_nuts_treedepth")
+```
+
+```{r mcmc_nuts_stepsize, echo=FALSE, fig.show='hide'}
+mcmc_nuts_stepsize(np_data, lp_data)
+```
+
+```{r results='asis', echo=FALSE}
+gallery_card("mcmc_nuts_stepsize", "MCMC-nuts.html", "mcmc_nuts_stepsize")
+```
+
+```{r results='asis', echo=FALSE}
+cat('
\n')
+```