{"spec_id":"cat-box-strip","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' cat-box-strip: Box Plot with Strip Overlay\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 89/100 | Created: 2026-09-02\n\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(ragg)\n\nset.seed(42)\n\n# --- Theme tokens -------------------------------------------------------\nTHEME       <- Sys.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG     <- if (THEME == \"light\") \"#FAF8F1\" else \"#1A1A17\"\nELEVATED_BG <- if (THEME == \"light\") \"#FFFDF6\" else \"#242420\"\nINK         <- if (THEME == \"light\") \"#1A1A17\" else \"#F0EFE8\"\nINK_SOFT    <- if (THEME == \"light\") \"#4A4A44\" else \"#B8B7B0\"\nBRAND       <- \"#009E73\"  # Imprint palette position 1 — always first series\n\n# --- Data -----------------------------------------------------------------\nfertilizers <- c(\"Control\", \"Nitrogen\", \"Phosphorus\", \"Compost\")\nn_per_group <- 60\n\ngrowth_df <- bind_rows(lapply(fertilizers, function(fertilizer) {\n  base <- switch(fertilizer,\n    Control    = 18,\n    Nitrogen   = 27,\n    Phosphorus = 22,\n    Compost    = 25\n  )\n  spread <- switch(fertilizer,\n    Control    = 3.5,\n    Nitrogen   = 5.0,\n    Phosphorus = 4.0,\n    Compost    = 4.5\n  )\n  data.frame(\n    fertilizer  = fertilizer,\n    plant_height = rnorm(n_per_group, mean = base, sd = spread)\n  )\n}))\n\ngrowth_df$fertilizer <- factor(growth_df$fertilizer, levels = fertilizers)\n\n# --- Plot -------------------------------------------------------------------\ntitle_text <- \"cat-box-strip · r · ggplot2 · anyplot.ai\"\n\np <- ggplot(growth_df, aes(x = fertilizer, y = plant_height)) +\n  geom_boxplot(\n    color = INK_SOFT,\n    fill = ELEVATED_BG,\n    outlier.shape = NA,\n    linewidth = 0.65,\n    width = 0.5\n  ) +\n  geom_jitter(\n    width = 0.15,\n    height = 0,\n    size = 2.6,\n    alpha = 0.45,\n    color = BRAND,\n    stroke = 0\n  ) +\n  stat_summary(\n    fun = mean,\n    geom = \"point\",\n    shape = 18,\n    size = 3.2,\n    color = INK\n  ) +\n  labs(\n    title = title_text,\n    x = \"Fertilizer Treatment\",\n    y = \"Plant Height (cm)\"\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.x = element_blank(),\n    panel.grid.minor  = element_blank(),\n    panel.grid.major.y = element_line(color = INK, linewidth = 0.2),\n    axis.title        = element_text(color = INK, size = 10),\n    axis.text         = element_text(color = INK_SOFT, size = 8),\n    axis.ticks        = element_blank(),\n    plot.title        = element_text(color = INK, size = 12, face = \"plain\"),\n    legend.position   = \"none\"\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"}