{"spec_id":"frequency-polygon-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' frequency-polygon-basic: Frequency Polygon for Distribution Comparison\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 86/100 | Created: 2026-05-17\n\nlibrary(ggplot2)\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\"\nIMPRINT   <- c(\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\",\n                 \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\n# --- Data -------------------------------------------------------------------\ndf <- data.frame(\n  score = c(\n    rnorm(200, mean = 72, sd = 8),   # Group A\n    rnorm(200, mean = 78, sd = 10),  # Group B\n    rnorm(200, mean = 75, sd = 7)    # Group C\n  ),\n  group = rep(c(\"Cohort A\", \"Cohort B\", \"Cohort C\"), each = 200)\n)\n\n# --- Calculate group means for reference lines ---\ngroup_means <- aggregate(score ~ group, data = df, FUN = mean)\n\n# --- Plot -------------------------------------------------------------------\np <- ggplot(df, aes(x = score, color = group, fill = group)) +\n  geom_freqpoly(binwidth = 3, linewidth = 1.2, alpha = 0.3) +\n  geom_vline(\n    data = group_means,\n    aes(xintercept = score, color = group),\n    linetype = \"dashed\",\n    linewidth = 0.8,\n    alpha = 0.6,\n    show.legend = FALSE\n  ) +\n  scale_color_manual(values = IMPRINT[1:3]) +\n  scale_fill_manual(values = IMPRINT[1:3]) +\n  labs(\n    title = \"frequency-polygon-basic · ggplot2 · anyplot.ai\",\n    x = \"Test Score\",\n    y = \"Frequency\",\n    color = \"Group\",\n    fill = \"Group\"\n  ) +\n  theme_minimal(base_size = 14) +\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.border      = element_rect(color = INK_SOFT, fill = NA, linewidth = 0.5),\n    panel.grid.major  = element_line(color = if (THEME == \"light\") \"#D0CECA\" else \"#3D3D39\", linewidth = 0.2),\n    panel.grid.minor  = element_blank(),\n    axis.title        = element_text(color = INK, size = 20),\n    axis.text         = element_text(color = INK_SOFT, size = 16),\n    plot.title        = element_text(color = INK, size = 24),\n    legend.background = element_rect(fill = PAGE_BG, color = NA),\n    legend.text       = element_text(color = INK_SOFT, size = 16),\n    legend.title      = element_text(color = INK, size = 18)\n  )\n\n# --- Save -------------------------------------------------------------------\nggsave(\n  filename = sprintf(\"plot-%s.png\", THEME),\n  plot     = p,\n  device   = ragg::agg_png,\n  width    = 16,\n  height   = 9,\n  units    = \"in\",\n  dpi      = 300\n)\n"}