{"spec_id":"range-interval","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' range-interval: Range Interval Chart\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 91/100 | Created: 2026-05-18\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\"\nINK_MUTED   <- if (THEME == \"light\") \"#6B6A63\" else \"#A8A79F\"\nBRAND       <- \"#009E73\"  # Okabe-Ito position 1 — first categorical series\n\n# --- Data -------------------------------------------------------------------\ndf <- data.frame(\n  month = c(\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n            \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"),\n  min_temp = c(-2, 1, 8, 14, 20, 25, 28, 27, 22, 15, 7, 0),\n  max_temp = c(5, 9, 16, 22, 28, 32, 35, 34, 28, 20, 12, 6)\n) %>%\n  mutate(month = factor(month, levels = unique(month)))\n\n# --- Plot -------------------------------------------------------------------\np <- ggplot(df, aes(x = month, ymin = min_temp, ymax = max_temp)) +\n  geom_linerange(\n    color = BRAND,\n    linewidth = 5.5,\n    alpha = 0.85\n  ) +\n  geom_point(\n    aes(y = min_temp),\n    color = BRAND,\n    size = 3.5,\n    alpha = 0.95\n  ) +\n  geom_point(\n    aes(y = max_temp),\n    color = BRAND,\n    size = 3.5,\n    alpha = 0.95\n  ) +\n  labs(\n    title = \"range-interval · r · ggplot2 · anyplot.ai\",\n    x = \"Month\",\n    y = \"Temperature (°C)\"\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.grid.major.x = element_blank(),\n    panel.grid.minor = element_blank(),\n    panel.grid.major.y = element_line(\n      color = INK_SOFT,\n      linewidth = 0.2\n    ),\n    panel.border = element_blank(),\n    axis.title = element_text(color = INK, size = 20),\n    axis.text = element_text(color = INK_SOFT, size = 16),\n    axis.ticks = element_line(color = INK_SOFT, linewidth = 0.4),\n    axis.line.y = element_line(color = INK_SOFT, linewidth = 0.4),\n    axis.line.x = element_blank(),\n    plot.title = element_text(color = INK, size = 24),\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    = 16,\n  height   = 9,\n  units    = \"in\",\n  dpi      = 300\n)\n"}