{"spec_id":"pie-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' pie-basic: Basic Pie Chart\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 86/100 | Created: 2026-05-28\n\nlibrary(ggplot2)\nlibrary(dplyr)\nlibrary(ragg)\n\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\"\n\nIMPRINT_PALETTE <- c(\n  \"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\",\n  \"#AE3030\", \"#2ABCCD\", \"#954477\", \"#99B314\"\n)\n\n# Annual budget allocation by department (millions USD)\nbudget <- tibble::tibble(\n  department = c(\"R&D\", \"Marketing\", \"Operations\", \"Sales\", \"HR\", \"IT\"),\n  amount     = c(32, 22, 18, 14, 10, 4)\n)\n\nbudget <- budget |>\n  arrange(desc(amount)) |>\n  mutate(\n    department = factor(department, levels = department),\n    pct        = amount / sum(amount) * 100,\n    label      = if_else(pct >= 5, sprintf(\"%.0f%%\", pct), \"\")\n  )\n\n# Pre-compute cumulative y positions (coord_polar stacks last-level-first).\nbudget <- budget |>\n  mutate(\n    ymax = rev(cumsum(rev(amount))),\n    ymin = ymax - amount,\n    ymid = (ymin + ymax) / 2\n  )\n\n# Explode largest slice (R&D 32%) outward by shifting its x range.\n# Using geom_rect with explicit xmin/xmax avoids position_stack limitations.\nEXPLODE_OFFSET <- 0.12\nbudget <- budget |>\n  mutate(\n    xmin = if_else(department == \"R&D\", 0.5 + EXPLODE_OFFSET, 0.5),\n    xmax = if_else(department == \"R&D\", 1.5 + EXPLODE_OFFSET, 1.5),\n    xmid = (xmin + xmax) / 2\n  )\n\npalette_named <- setNames(\n  IMPRINT_PALETTE[seq_len(nrow(budget))],\n  levels(budget$department)\n)\n\np <- ggplot(budget) +\n  geom_rect(\n    aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = department),\n    color     = PAGE_BG,\n    linewidth = 0.8\n  ) +\n  geom_text(\n    aes(x = xmid, y = ymid, label = label),\n    color    = \"#FAF8F1\",\n    size     = 3.8,\n    fontface = \"bold\"\n  ) +\n  scale_x_continuous(limits = c(0.5, 1.65), expand = c(0, 0)) +\n  scale_y_continuous(limits = c(0, 100), expand = c(0, 0)) +\n  coord_polar(theta = \"y\", start = 0) +\n  scale_fill_manual(values = palette_named) +\n  labs(\n    title = \"pie-basic · r · ggplot2 · anyplot.ai\",\n    fill  = \"Department\"\n  ) +\n  theme_void() +\n  theme(\n    plot.background     = element_rect(fill = PAGE_BG, color = PAGE_BG),\n    plot.title          = element_text(\n      color  = INK,\n      size   = 12,\n      hjust  = 0.5,\n      face   = \"bold\",\n      margin = margin(b = 10, t = 10)\n    ),\n    plot.title.position = \"plot\",\n    legend.text         = element_text(color = INK_SOFT, size = 8),\n    legend.title        = element_text(color = INK, size = 10),\n    legend.background   = element_rect(fill = ELEVATED_BG, color = INK_SOFT, linewidth = 0.5),\n    legend.key.size     = unit(0.5, \"cm\"),\n    legend.margin       = margin(6, 6, 6, 6),\n    plot.margin         = margin(30, 40, 30, 40)\n  )\n\nggsave(\n  filename = sprintf(\"plot-%s.png\", THEME),\n  plot     = p,\n  device   = ragg::agg_png,\n  width    = 6,\n  height   = 6,\n  units    = \"in\",\n  dpi      = 400\n)\n"}