{"spec_id":"hexbin-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nhexbin-basic: Basic Hexbin Plot\nLibrary: letsplot 4.10.1 | Python 3.13.13\nQuality: 92/100 | Updated: 2026-05-29\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    coord_fixed,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_hex,\n    ggplot,\n    ggsize,\n    labs,\n    layer_tooltips,\n    scale_fill_gradient,\n    theme,\n    theme_minimal,\n)\nfrom lets_plot.export import ggsave\n\n\nLetsPlot.setup_html()\n\n# Theme tokens (Imprint palette — theme-adaptive chrome)\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\n# Data - Simulated GPS ping density across a metro area (km from city center)\nnp.random.seed(42)\nn_points = 10000\n\n# Downtown core - elongated east-west along commercial corridor\ndowntown_east = np.random.randn(n_points // 2) * 2.0 + 4\ndowntown_north = np.random.randn(n_points // 2) * 1.2 + 3\n\n# University campus - compact circular footprint\ncampus_east = np.random.randn(n_points // 3) * 1.0 - 3\ncampus_north = np.random.randn(n_points // 3) * 1.0 + 1\n\n# Transit hub - tight cluster of commuters\ntransit_east = np.random.randn(n_points // 6) * 0.5 + 0.5\ntransit_north = np.random.randn(n_points // 6) * 0.5 - 3.5\n\n# Sparse residential pings across outer metro area\nbg_east = np.random.uniform(-7, 9, n_points // 10)\nbg_north = np.random.uniform(-6, 7, n_points // 10)\n\neast_km = np.concatenate([downtown_east, campus_east, transit_east, bg_east])\nnorth_km = np.concatenate([downtown_north, campus_north, transit_north, bg_north])\n\ndf = pd.DataFrame({\"east_km\": east_km, \"north_km\": north_km})\n\n# Plot - Hexagonal binning to reveal pedestrian density hotspots\nplot = (\n    ggplot(df, aes(x=\"east_km\", y=\"north_km\"))\n    + geom_hex(\n        aes(fill=\"..count..\"),\n        bins=[35, 35],\n        color=\"#FFFFFF\",\n        size=0.3,\n        tooltips=layer_tooltips()\n        .title(\"Hex Bin\")\n        .line(\"pings|@..count..\")\n        .line(\"density|@..density..\")\n        .format(\"@..density..\", \".3f\"),\n    )\n    + scale_fill_gradient(low=\"#009E73\", high=\"#4467A3\", name=\"Ping Count\", trans=\"sqrt\")\n    + coord_fixed()\n    + labs(\n        x=\"East–West (km from center)\",\n        y=\"North–South (km from center)\",\n        title=\"hexbin-basic · python · letsplot · anyplot.ai\",\n        subtitle=\"GPS ping density — sqrt-scaled Imprint sequential colormap\",\n    )\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major=element_blank(),\n        panel_grid_minor=element_blank(),\n        axis_title=element_text(size=12, color=INK),\n        axis_text=element_text(size=10, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT),\n        plot_title=element_text(size=16, face=\"bold\", color=INK),\n        plot_subtitle=element_text(size=11, color=INK_SOFT),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(size=10, color=INK_SOFT),\n        legend_title=element_text(size=12, face=\"bold\", color=INK),\n    )\n    + ggsize(800, 450)\n)\n\n# Save PNG (scale=4 gives 3200×1800)\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\n\n# Save HTML for interactive tooltips\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}