## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----eval = FALSE-------------------------------------------------------------
# library(ggplot2)
# library(geomtextpath)
# library(ggrepel)
# 
# # --- filter to one outcome --------------------------------------------------
# outcome_name = "my_outcome"
# d_sens = subset(sens, outcome == outcome_name)
# d_bench = subset(bench, outcome == outcome_name)
# 
# # clamp any Inf bias values for plotting
# d_sens$bias_bound = with(d_sens, ifelse(
#     is.finite(bias_bound),
#     bias_bound,
#     1.5 * max(bias_bound[is.finite(bias_bound)])
# ))
# 
# # --- contour break structure -------------------------------------------------
# # major breaks get text labels; semi-major and minor add visual density
# contour_exp = -1:1
# breaks_minor   = 10^c(contour_exp, 2) %x% c(2:4, 6:9)
# breaks_semimaj = 10^contour_exp %x% 5
# breaks_maj     = 10^contour_exp %x% 10
# c_col = "#f08f88"   # contour line color
# 
# # --- build plot --------------------------------------------------------------
# ggplot(d_sens, aes(c_predictor, c_outcome)) +
#     # minor contour lines (no labels)
#     geom_contour(aes(z = bias_bound), breaks = breaks_minor,
#                  color = c_col, lwd = 0.12) +
#     # semi-major contour lines (no labels)
#     geom_contour(aes(z = bias_bound), breaks = breaks_semimaj,
#                  color = c_col, lwd = 0.48) +
#     # major contour lines with numeric labels
#     geom_textcontour(
#         aes(z = bias_bound),
#         breaks = breaks_maj,
#         color = c_col, lwd = 0.7,
#         hjust = 0.55, vjust = 1.25,
#         halign = "left", size = 3.0,
#         fontface = "bold", upright = TRUE, straight = TRUE
#     ) +
#     # a labeled contour for a specific reference value (e.g. the point estimate)
#     geom_textcontour(
#         aes(z = bias_bound, label = "Estimated effect"),
#         breaks = d_sens$estimate[1],
#         color = "#425682", lwd = 0.7,
#         hjust = 0.55, vjust = 1.25,
#         size = 3.0, fontface = "bold"
#     ) +
#     # benchmark points and labels
#     geom_point(data = d_bench, size = 0.7) +
#     geom_text_repel(
#         aes(label = covariate),
#         data = d_bench,
#         hjust = 1.25, nudge_x = 0.002, nudge_y = 0.002,
#         size = 3
#     ) +
#     # square-root scale spreads out the lower-left corner
#     scale_x_continuous(breaks = seq(0, 1, 0.1), transform = "sqrt") +
#     scale_y_continuous(breaks = seq(0, 1, 0.1), transform = "sqrt") +
#     coord_cartesian(xlim = 0:1, ylim = 0:1, expand = FALSE) +
#     labs(
#         x = bquote(1 - {R^2}[alpha^A ~ "~" ~ alpha]),
#         y = bquote({R^2}[bar(Y) ~ "~" ~ A ~ "|" ~ bar(X) ~ "," ~ Z]),
#         title = paste("Sensitivity contour plot:", outcome_name)
#     ) +
#     theme_bw() +
#     theme(
#         panel.grid = element_line(color = "#aaa", linetype = "dotted",
#                                   linewidth = 0.24),
#         panel.grid.minor = element_blank(),
#         axis.title = element_text(size = 12)
#     )

