Skip to contents

Creates a forest plot from a `gtsummary`-style object produced by `gtregression` functions (e.g., `uni_reg()`, `multi_reg()`). The function supports both univariate and multivariable models, renders hierarchical labels (variable headers vs. levels), and computes significance highlighting using either *p*-values (linear models) or CI-vs-reference rules (non-linear models).

Usage

plot_reg(
  tbl,
  title = NULL,
  order_y = NULL,
  log_x = FALSE,
  xlim = NULL,
  breaks = NULL,
  point_color = "#1F77B4",
  errorbar_color = "#4C4C4C",
  base_size = 14,
  show_ref = TRUE,
  sig_color = NULL,
  sig_errorbar_color = NULL,
  alpha = 0.05
)

Arguments

tbl

A `gtsummary`-like object returned by `gtregression` (must contain `table_body` and attributes `source` and `approach`).

title

Optional plot title (character).

order_y

Optional character vector to customize the y-axis header ordering.

log_x

Logical. If `TRUE`, log x-axis (ignored for linear models).

xlim

Optional numeric vector of length 2 for x-axis limits.

breaks

Optional numeric vector for x-axis tick breaks (ignored if `log_x = TRUE`).

point_color

Fill color for points (default `"#1F77B4"`).

errorbar_color

Color for all error bars (default `"#4C4C4C"`).

base_size

Base font size for `theme_minimal()` (default `14`).

show_ref

Logical. If `TRUE`, includes the reference level on the plot and labels it `(Ref.)`.

sig_color

Optional fill color for **significant** points; if `NULL`, significant points reuse `point_color`.

sig_errorbar_color

Optional color for **significant** error bars; if `NULL`, significant bars reuse `errorbar_color`.

alpha

Significance level for linear models when `p.value` is available (default `0.05`).

Value

A `ggplot2` object representing the forest plot.

Details

**Reference line**: The vertical reference is fixed at `0` for linear models and `1` for all other approaches, inferred from `attr(tbl, "approach")`.

**Header / data detection**: Variable headers are recognized via `row_type == "label"` together with `header_row` or missing CI; categorical levels use `row_type == "level"`; continuous predictors appear as `row_type == "label"` **with** CIs and are treated as data rows.

**Significance highlighting**: - For `approach == "linear"` with available `p.value`, rows are significant when `p.value < alpha`. - Otherwise, rows are significant when the CI does not cross the reference (`0` or `1` as above). Use `sig_color` / `sig_errorbar_color` to customize the appearance.

Examples

# \donttest{
if (requireNamespace("mlbench", quietly = TRUE) &&
    requireNamespace("gtregression", quietly = TRUE)) {
  data("PimaIndiansDiabetes2", package = "mlbench")
  pima <- PimaIndiansDiabetes2
  pima$diabetes <- ifelse(pima$diabetes == "pos", 1, 0)
  pima$bmi_cat <- cut(
    pima$mass,
    breaks = c(-Inf, 18.5, 24.9, 29.9, Inf),
    labels = c("Underweight", "Normal", "Overweight", "Obese")
  )

  # Univariate logistic regression table via gtregression
  tbl_uni <- gtregression::uni_reg(
    data = pima,
    outcome = "diabetes",
    exposures = c("age", "bmi_cat"),
    approach = "logit"
  )

  p <- plot_reg(tbl_uni, title = "Univariate (logit)", sig_color = "#D55E00")
  print(p)
}
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
#> Warning: collapsing to unique 'x' values

# }