{"spec_id":"cat-box-strip","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\ncat-box-strip: Box Plot with Strip Overlay\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 85/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\nimport sys\n\n\n# Remove current directory from path to avoid shadowing plotnine library\nif sys.path and sys.path[0]:\n    sys.path.pop(0)\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_line,\n    element_rect,\n    element_text,\n    geom_boxplot,\n    geom_jitter,\n    ggplot,\n    labs,\n    scale_color_manual,\n    scale_fill_manual,\n    theme,\n    theme_minimal,\n)\n\n\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\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\"]\n\n# Data - Plant growth measurements across fertilizer types\nnp.random.seed(42)\n\ncategories = [\"Control\", \"Fertilizer A\", \"Fertilizer B\", \"Fertilizer C\"]\nn_per_group = 40\n\ndata = []\n# Control: lower values, moderate spread\ncontrol = np.random.normal(loc=25, scale=5, size=n_per_group)\n# Fertilizer A: moderate improvement\nfert_a = np.random.normal(loc=35, scale=6, size=n_per_group)\n# Fertilizer B: good improvement, tighter distribution\nfert_b = np.random.normal(loc=42, scale=4, size=n_per_group)\n# Fertilizer C: best results but with outliers (bimodal)\nfert_c = np.concatenate(\n    [np.random.normal(loc=48, scale=4, size=n_per_group - 5), np.random.normal(loc=30, scale=3, size=5)]\n)\n\nfor cat, vals in zip(categories, [control, fert_a, fert_b, fert_c], strict=True):\n    for v in vals:\n        data.append({\"Fertilizer\": cat, \"Growth (cm)\": v})\n\ndf = pd.DataFrame(data)\ndf[\"Fertilizer\"] = pd.Categorical(df[\"Fertilizer\"], categories=categories, ordered=True)\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"Fertilizer\", y=\"Growth (cm)\", fill=\"Fertilizer\"))\n    + geom_boxplot(alpha=0.7, width=0.6, outlier_shape=\"\", size=1)\n    + geom_jitter(aes(color=\"Fertilizer\"), width=0.15, alpha=0.6, size=3, show_legend=False)\n    + scale_fill_manual(values=IMPRINT)\n    + scale_color_manual(values=IMPRINT)\n    + labs(x=\"Treatment Group\", y=\"Plant Growth (cm)\", title=\"cat-box-strip · plotnine · anyplot.ai\")\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),\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_border=element_rect(color=INK_SOFT, fill=None),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT),\n        plot_title=element_text(size=24, color=INK),\n        text=element_text(size=14),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(size=16, color=INK_SOFT),\n        legend_title=element_text(size=18, color=INK),\n        legend_position=\"right\",\n    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}