{"spec_id":"density-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' density-basic: Basic Density Plot\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 88/100 | Created: 2026-05-30\n\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(ragg)\n\nset.seed(42)\n\n# Theme tokens — Imprint palette, theme-adaptive chrome\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\"\nINK_MUTED   <- if (THEME == \"light\") \"#6B6A63\" else \"#A8A79F\"\n\nIMPRINT_PALETTE <- c(\n    \"#009E73\",  # 1 — brand green (ALWAYS first series)\n    \"#C475FD\",  # 2 — lavender\n    \"#4467A3\",  # 3 — blue\n    \"#BD8233\",  # 4 — ochre\n    \"#AE3030\",  # 5 — matte red\n    \"#2ABCCD\",  # 6 — cyan\n    \"#954477\",  # 7 — rose\n    \"#99B314\"   # 8 — lime\n)\nBRAND <- IMPRINT_PALETTE[1]\n\n# Raised fill alpha for dark theme so the fill silhouette reads clearly against near-black bg\nFILL_ALPHA <- if (THEME == \"light\") 0.22 else 0.35\n\n# Data — simulated plant seedling heights (mm) from two cultivars mixed in one batch,\n# producing a characteristic bimodal distribution (short- and tall-growing varieties)\nheights_short <- rnorm(420, mean = 38, sd = 6)\nheights_tall  <- rnorm(180, mean = 72, sd = 9)\ndf <- data.frame(height = c(heights_short, heights_tall))\n\n# Compute KDE to get annotation positions at the two cultivar peaks\ndens_curve <- density(df$height, bw = \"sj\")\ny_offset   <- max(dens_curve$y) * 0.06\nann_x      <- c(38, 72)\nann_y      <- approx(dens_curve$x, dens_curve$y, xout = ann_x)$y + y_offset\n\n# Plot\np <- ggplot(df, aes(x = height)) +\n    geom_density(\n        fill      = BRAND,\n        color     = BRAND,\n        alpha     = FILL_ALPHA,\n        linewidth = 1.2,\n        bw        = \"sj\"\n    ) +\n    geom_rug(\n        color     = BRAND,\n        alpha     = 0.12,\n        length    = unit(0.018, \"npc\"),\n        linewidth = 0.4\n    ) +\n    annotate(\"text\",\n        x          = ann_x,\n        y          = ann_y,\n        label      = c(\"Short-growing\\n(n = 420)\", \"Tall-growing\\n(n = 180)\"),\n        color      = INK_SOFT,\n        size       = 2.8,\n        hjust      = 0.5,\n        vjust      = 0,\n        lineheight = 0.9\n    ) +\n    scale_x_continuous(expand = expansion(mult = c(0.02, 0.02))) +\n    scale_y_continuous(expand = expansion(mult = c(0.0, 0.18))) +\n    labs(\n        x     = \"Seedling Height (mm)\",\n        y     = \"Density\",\n        title = \"density-basic · r · ggplot2 · anyplot.ai\"\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 = INK_SOFT, linewidth = 0.2),\n        panel.grid.major.x = element_blank(),\n        panel.grid.minor   = element_blank(),\n        panel.border       = element_blank(),\n        axis.title         = element_text(color = INK,      size = 10),\n        axis.text          = element_text(color = INK_SOFT, size = 8),\n        axis.line          = element_line(color = INK_SOFT, linewidth = 0.4),\n        axis.ticks         = element_line(color = INK_SOFT, linewidth = 0.3),\n        plot.title         = element_text(color = INK, size = 12, face = \"bold\",\n                                          margin = margin(b = 10)),\n        plot.margin        = margin(20, 25, 15, 15)\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"}