{"spec_id":"facet-grid","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nfacet-grid: Faceted Grid Plot\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 95/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    facet_grid,\n    geom_point,\n    geom_smooth,\n    ggplot,\n    ggsave,\n    ggsize,\n    labs,\n    scale_color_manual,\n    theme,\n    theme_minimal,\n)\n\n\nLetsPlot.setup_html()\n\n# Theme tokens (see prompts/default-style-guide.md \"Background\" + \"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\"\nRULE = \"rgba(26,26,23,0.10)\" if THEME == \"light\" else \"rgba(240,239,232,0.10)\"\n\n# Okabe-Ito palette (categorical)\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\"]\n\n# Data - sales analysis by category and region\nnp.random.seed(42)\n\ncategories = [\"Electronics\", \"Clothing\", \"Home\"]\nregions = [\"North\", \"South\", \"East\", \"West\"]\n\n# Generate all combinations of categories and regions\ncategory_list = []\nregion_list = []\nprice_list = []\nunits_list = []\n\nfor cat in categories:\n    for region in regions:\n        n_points = 25\n        base_price = {\"Electronics\": 200, \"Clothing\": 50, \"Home\": 100}[cat]\n        region_factor = {\"North\": 1.2, \"South\": 0.9, \"East\": 1.0, \"West\": 1.1}[region]\n\n        price = np.random.uniform(base_price * 0.5, base_price * 1.5, n_points)\n        units = (base_price * 100 / price) * region_factor + np.random.randn(n_points) * 10\n        units = np.maximum(units, 0)\n\n        category_list.extend([cat] * n_points)\n        region_list.extend([region] * n_points)\n        price_list.extend(price)\n        units_list.extend(units)\n\ndf = pd.DataFrame({\"Category\": category_list, \"Region\": region_list, \"Price\": price_list, \"Units Sold\": units_list})\n\n# Theme-adaptive styling\nanyplot_theme = theme(\n    plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n    panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n    panel_grid_major=element_line(color=RULE, size=0.3),\n    panel_grid_minor=element_blank(),\n    axis_title=element_text(color=INK, size=20),\n    axis_text=element_text(color=INK_SOFT, size=16),\n    axis_line=element_line(color=INK_SOFT, size=0.5),\n    plot_title=element_text(color=INK, size=24),\n    legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n    legend_text=element_text(color=INK_SOFT, size=16),\n    legend_title=element_text(color=INK, size=18),\n    strip_text=element_text(color=INK, size=16),\n    strip_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n)\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"Price\", y=\"Units Sold\", color=\"Category\"))\n    + geom_point(size=3, alpha=0.7)\n    + geom_smooth(method=\"lm\", se=False, size=1.5)\n    + facet_grid(x=\"Region\", y=\"Category\")\n    + scale_color_manual(values=IMPRINT)\n    + labs(title=\"facet-grid · letsplot · anyplot.ai\", x=\"Unit Price ($)\", y=\"Units Sold\")\n    + theme_minimal()\n    + anyplot_theme\n    + ggsize(1600, 900)\n)\n\n# Save PNG and HTML with theme-suffixed names\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=3)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}