{"spec_id":"facet-grid","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nfacet-grid: Faceted Grid Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 95/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\nimport sys\n\n\n# Handle import conflicts: remove the script directory from sys.path to prevent\n# shadowing of installed modules (matplotlib, plotnine, etc.)\n_script_dir = os.path.dirname(os.path.abspath(__file__))\n_original_path = sys.path.copy()\nsys.path = [p for p in sys.path if os.path.abspath(p) != _script_dir]\n\n# Also remove any __pycache__ or .pyc files that might exist\n_mod_cache = {k: v for k, v in sys.modules.items() if k not in (\"matplotlib\", \"plotnine\")}\n\ntry:\n    import numpy as np\n    import pandas as pd\n    from plotnine import (\n        aes,\n        element_line,\n        element_rect,\n        element_text,\n        facet_grid,\n        geom_point,\n        ggplot,\n        labs,\n        scale_color_manual,\n        theme,\n        theme_minimal,\n    )\nfinally:\n    pass\n\n# Theme tokens\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# Okabe-Ito palette\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\"]\n\n# Data - Student exam scores across teaching methods and subjects\nnp.random.seed(42)\n\nmethods = [\"In-Person\", \"Online\", \"Hybrid\"]\nsubjects = [\"Math\", \"Science\", \"Reading\", \"Writing\"]\n\ndata = []\nfor subject in subjects:\n    for method in methods:\n        subject_effect = {\"Math\": 5, \"Science\": 3, \"Reading\": -2, \"Writing\": 0}[subject]\n        method_effect = {\"In-Person\": 3, \"Online\": -2, \"Hybrid\": 1}[method]\n\n        n_points = 15\n        hours = np.random.uniform(2, 10, n_points)\n\n        base_score = 60 + 6 * hours + subject_effect + method_effect\n        score = base_score + np.random.randn(n_points) * 5\n        score = np.clip(score, 30, 100)\n\n        for i in range(n_points):\n            data.append({\"hours\": hours[i], \"score\": score[i], \"subject\": subject, \"method\": method})\n\ndf = pd.DataFrame(data)\n\ndf[\"subject\"] = pd.Categorical(df[\"subject\"], categories=subjects, ordered=True)\ndf[\"method\"] = pd.Categorical(df[\"method\"], categories=methods, ordered=True)\n\nplot = (\n    ggplot(df, aes(x=\"hours\", y=\"score\", color=\"method\"))\n    + geom_point(size=4, alpha=0.75)\n    + facet_grid(\"subject ~ method\", labeller=\"label_both\")\n    + scale_color_manual(values=IMPRINT[:3])\n    + labs(title=\"facet-grid · plotnine · anyplot.ai\", x=\"Study Hours\", y=\"Exam Score\", color=\"Method\")\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        plot_title=element_text(size=24, color=INK, ha=\"center\"),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        strip_text_x=element_text(size=14, color=INK, face=\"bold\"),\n        strip_text_y=element_text(size=14, color=INK, face=\"bold\", rotation=0),\n        strip_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_title=element_text(size=16, color=INK),\n        legend_text=element_text(size=14, color=INK_SOFT),\n        legend_position=\"right\",\n        panel_grid_major=element_line(color=INK, size=0.3, alpha=0.10),\n        panel_grid_minor=element_line(color=INK, size=0.2, alpha=0.05),\n        panel_spacing_x=0.06,\n        panel_spacing_y=0.06,\n    )\n)\n\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}