{"spec_id":"violin-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' violin-basic: Basic Violin Plot\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 87/100 | Created: 2026-05-29\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\"\nELEVATED_BG <- if (THEME == \"light\") \"#FFFDF6\" else \"#242420\"\nINK         <- if (THEME == \"light\") \"#1A1A17\" else \"#F0EFE8\"\nINK_SOFT    <- if (THEME == \"light\") \"#4A4A44\" else \"#B8B7B0\"\n\n# Imprint palette — 4 series for 4 class groups\nIMPRINT_PALETTE <- c(\n  \"#009E73\",  # 1 — brand green\n  \"#C475FD\",  # 2 — lavender\n  \"#4467A3\",  # 3 — blue\n  \"#BD8233\"   # 4 — ochre\n)\n\n# Data: test scores (50–100) across 4 class groups with distinct distribution shapes\nclass_a <- rnorm(120, mean = 72, sd = 10)                                        # average, symmetric\nclass_b <- c(rnorm(60, mean = 60, sd = 5), rnorm(60, mean = 86, sd = 5))        # bimodal\nclass_c <- rnorm(120, mean = 83, sd = 6)                                         # high-performing\nclass_d <- pmax(50, pmin(100, 58 + rexp(120, rate = 0.10)))                      # low, right-skewed\n\nscores <- tibble::tibble(\n  class = rep(c(\"Class A\", \"Class B\", \"Class C\", \"Class D\"),\n              times = c(length(class_a), length(class_b), length(class_c), length(class_d))),\n  score = c(class_a, class_b, class_c, class_d)\n)\nscores$class <- factor(scores$class, levels = c(\"Class A\", \"Class B\", \"Class C\", \"Class D\"))\n\n# Alpha: emphasize the bimodal Class B distribution\nALPHA_VALUES <- c(\"Class A\" = 0.62, \"Class B\" = 0.88, \"Class C\" = 0.62, \"Class D\" = 0.62)\n\n# Grid color at ~25% opacity to keep lines subtle\nGRID_COLOR <- adjustcolor(INK_SOFT, alpha.f = 0.25)\n\n# Plot\np <- ggplot(scores, aes(x = class, y = score, fill = class, alpha = class)) +\n  geom_violin(\n    trim           = FALSE,\n    color          = PAGE_BG,   # quantile lines appear as PAGE_BG cuts through the fill\n    linewidth      = 0.5,\n    draw_quantiles = c(0.25, 0.5, 0.75)\n  ) +\n  annotate(\n    \"text\",\n    x = \"Class B\", y = 104,\n    label    = \"bimodal\",\n    color    = INK_SOFT,\n    size     = 2.8,\n    fontface = \"italic\"\n  ) +\n  scale_fill_manual(values = IMPRINT_PALETTE, guide = \"none\") +\n  scale_alpha_manual(values = ALPHA_VALUES, guide = \"none\") +\n  scale_y_continuous(breaks = seq(50, 100, by = 10)) +\n  coord_cartesian(ylim = c(25, 108)) +\n  labs(\n    title = \"violin-basic · r · ggplot2 · anyplot.ai\",\n    x     = \"Class Group\",\n    y     = \"Test Score\"\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_COLOR, linewidth = 0.25),\n    panel.grid.major.x = element_blank(),\n    panel.grid.minor   = element_blank(),\n    panel.border       = element_blank(),\n    axis.line.x        = element_line(color = INK_SOFT,  linewidth = 0.4),\n    axis.line.y        = element_line(color = INK_SOFT,  linewidth = 0.4),\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, margin = margin(b = 12)),\n    plot.margin        = margin(t = 20, r = 20, b = 16, l = 16)\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"}