{"spec_id":"hexbin-basic","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' hexbin-basic: Basic Hexbin Plot\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 91/100 | Created: 2026-05-29\n\nlibrary(ggplot2)\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\"\nGRID_COLOR  <- if (THEME == \"light\") \"#1A1A1726\" else \"#F0EFE826\"\n\n# Data — simulated GPS mobility data: three urban activity clusters\nx <- c(\n    rnorm(5000, mean =  0.4, sd = 1.1),   # downtown core\n    rnorm(3000, mean = -2.6, sd = 0.6),   # transit hub\n    rnorm(2000, mean =  3.0, sd = 0.8)    # university campus\n)\ny <- c(\n    rnorm(5000, mean =  0.2, sd = 0.9),   # downtown core\n    rnorm(3000, mean =  2.3, sd = 0.5),   # transit hub\n    rnorm(2000, mean = -1.6, sd = 0.8)    # university campus\n)\n\ndf <- data.frame(\n    easting  = x,\n    northing = y\n)\n\nplot_title <- \"hexbin-basic · r · ggplot2 · anyplot.ai\"\nn_chars    <- nchar(plot_title)\ntitle_fs   <- if (n_chars > 67) round(12 * 67 / n_chars) else 12\n\n# Plot\np <- ggplot(df, aes(x = easting, y = northing)) +\n    geom_hex(bins = 35, color = NA) +\n    scale_fill_gradient(\n        low   = \"#009E73\",\n        high  = \"#4467A3\",\n        name  = \"Count\",\n        guide = guide_colorbar(\n            barwidth  = unit(0.6, \"cm\"),\n            barheight = unit(4.5, \"cm\"),\n            ticks     = FALSE\n        )\n    ) +\n    annotate(\"text\", x =  0.4, y =  0.9, label = \"Downtown Core\",\n             color = INK_SOFT, size = 2.8, fontface = \"italic\", hjust = 0.5) +\n    annotate(\"text\", x = -2.6, y =  2.9, label = \"Transit Hub\",\n             color = INK_SOFT, size = 2.8, fontface = \"italic\", hjust = 0.5) +\n    annotate(\"text\", x =  3.0, y = -2.3, label = \"University Campus\",\n             color = INK_SOFT, size = 2.8, fontface = \"italic\", hjust = 0.5) +\n    labs(\n        title = plot_title,\n        x     = \"Easting (km from city center)\",\n        y     = \"Northing (km from city center)\"\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.border      = element_blank(),\n        panel.grid.major  = element_line(color = GRID_COLOR, linewidth = 0.4),\n        panel.grid.minor  = 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_blank(),\n        plot.title        = element_text(\n            color  = INK,\n            size   = title_fs,\n            face   = \"bold\",\n            margin = margin(b = 8)\n        ),\n        legend.background = element_rect(fill = ELEVATED_BG, color = NA),\n        legend.text       = element_text(color = INK_SOFT, size = 8),\n        legend.title      = element_text(color = INK, size = 10),\n        plot.margin       = margin(12, 15, 12, 12, \"pt\")\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"}