{"spec_id":"pdp-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' pdp-basic: Partial Dependence Plot\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 94/100 | Created: 2026-09-05\n\nlibrary(ggplot2)\nlibrary(tibble)\nlibrary(scales)\nlibrary(ragg)\n\nset.seed(42)\n\n# --- Theme tokens -------------------------------------------------------\nTHEME     <- Sys.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG   <- if (THEME == \"light\") \"#FAF8F1\" else \"#1A1A17\"\nINK       <- if (THEME == \"light\") \"#1A1A17\" else \"#F0EFE8\"\nINK_SOFT  <- if (THEME == \"light\") \"#4A4A44\" else \"#B8B7B0\"\nINK_MUTED <- if (THEME == \"light\") \"#6B6A63\" else \"#A8A79F\"\nGRID      <- adjustcolor(INK, alpha.f = 0.15)\nIMPRINT_PALETTE <- c(\n  \"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\",\n  \"#AE3030\", \"#2ABCCD\", \"#954477\", \"#99B314\"\n)\nBRAND <- IMPRINT_PALETTE[1]\n\n# --- Data -----------------------------------------------------------------\n# Partial dependence of a gradient boosting regressor predicting house sale\n# price from living area (sq ft), averaging over every other feature.\nliving_area <- seq(500, 4000, length.out = 80)\n\n# Diminishing marginal effect of extra square footage, centered at zero so\n# the curve reads as a relative price effect rather than an absolute level.\nraw_effect <- 285000 * (1 - exp(-living_area / 1150))\npartial_dependence <- raw_effect - mean(raw_effect)\n\n# Model uncertainty widens where training data thins out at the tails.\ndensity_weight <- dnorm(living_area, mean = 2100, sd = 700)\nband_halfwidth <- 9000 + 26000 * (1 - density_weight / max(density_weight))\n\npdp_df <- tibble(\n  living_area        = living_area,\n  partial_dependence = partial_dependence,\n  lower              = partial_dependence - band_halfwidth,\n  upper              = partial_dependence + band_halfwidth\n)\n\n# Observed training values for the rug, drawn from the same density that\n# shaped the uncertainty band above.\nrug_values <- rnorm(220, mean = 2100, sd = 700)\nrug_df <- tibble(living_area = rug_values[rug_values >= 500 & rug_values <= 4000])\n\n# --- Plot -------------------------------------------------------------------\np <- ggplot(pdp_df, aes(x = living_area, y = partial_dependence)) +\n  geom_hline(yintercept = 0, color = INK_MUTED, linewidth = 0.4, linetype = \"dashed\") +\n  geom_ribbon(aes(ymin = lower, ymax = upper), fill = BRAND, alpha = 0.15) +\n  geom_line(color = BRAND, linewidth = 1.1) +\n  geom_rug(\n    data = rug_df, aes(x = living_area), inherit.aes = FALSE,\n    sides = \"b\", color = INK_SOFT, alpha = 0.5, linewidth = 0.3\n  ) +\n  scale_x_continuous(labels = scales::comma) +\n  scale_y_continuous(labels = scales::dollar_format(scale = 1e-3, suffix = \"k\")) +\n  labs(\n    title = \"pdp-basic · r · ggplot2 · anyplot.ai\",\n    x     = \"Living Area (sq ft)\",\n    y     = \"Partial Dependence on Sale Price\"\n  ) +\n  theme_minimal(base_size = 8) +\n  theme(\n    plot.background     = element_rect(fill = PAGE_BG, color = PAGE_BG),\n    panel.background    = element_rect(fill = PAGE_BG, color = NA),\n    panel.grid.major.y  = element_line(color = GRID, linewidth = 0.5),\n    panel.grid.minor    = element_blank(),\n    panel.grid.major.x  = element_blank(),\n    axis.line           = element_line(color = INK_SOFT, linewidth = 0.4),\n    axis.ticks          = element_blank(),\n    axis.title          = element_text(color = INK, size = 10),\n    axis.text           = element_text(color = INK_SOFT, size = 8),\n    plot.title          = element_text(color = INK, size = 12),\n    plot.margin         = margin(12, 16, 8, 8)\n  )\n\n# --- Save -------------------------------------------------------------------\nggsave(\n  filename = sprintf(\"plot-%s.png\", THEME),\n  plot     = p,\n  device   = ragg::agg_png,\n  width    = 8,\n  height   = 4.5,\n  units    = \"in\",\n  dpi      = 400\n)\n"}