{"spec_id":"violin-box","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nviolin-box: Violin Plot with Embedded Box Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 87/100 | Updated: 2026-05-12\n\"\"\"\n\nimport importlib\nimport os\nimport sys\n\n\n# Avoid importing from local directory\nfor path in list(sys.path):\n    if \"violin-box\" in path or \"implementations\" in path:\n        sys.path.remove(path)\n\nnp = importlib.import_module(\"numpy\")\npd = importlib.import_module(\"pandas\")\nplotnine = importlib.import_module(\"plotnine\")\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\nnp.random.seed(42)\nn_per_group = 80\n\ndata = pd.DataFrame(\n    {\n        \"Value\": np.concatenate(\n            [\n                np.random.normal(55, 10, n_per_group),\n                np.random.exponential(8, n_per_group) + 35,\n                np.concatenate([np.random.normal(40, 5, n_per_group // 2), np.random.normal(65, 5, n_per_group // 2)]),\n                np.random.uniform(30, 70, n_per_group),\n            ]\n        ),\n        \"Group\": [\"Product A\"] * n_per_group\n        + [\"Product B\"] * n_per_group\n        + [\"Product C\"] * n_per_group\n        + [\"Product D\"] * n_per_group,\n    }\n)\n\n# Plot\nanyplot_theme = plotnine.theme(\n    plot_background=plotnine.element_rect(fill=PAGE_BG, color=PAGE_BG),\n    panel_background=plotnine.element_rect(fill=PAGE_BG, color=None),\n    panel_grid_major=plotnine.element_line(color=INK, size=0.3, alpha=0.10),\n    panel_grid_minor=plotnine.element_line(color=INK, size=0.2, alpha=0.05),\n    panel_border=plotnine.element_blank(),\n    axis_title=plotnine.element_text(color=INK, size=20, weight=\"bold\"),\n    axis_text=plotnine.element_text(color=INK_SOFT, size=16),\n    axis_line_x=plotnine.element_line(color=INK_SOFT, size=0.7),\n    axis_line_y=plotnine.element_line(color=INK_SOFT, size=0.7),\n    axis_ticks=plotnine.element_line(color=INK_SOFT, size=0.4),\n    axis_ticks_length=3,\n    plot_title=plotnine.element_text(color=INK, size=24, weight=\"bold\"),\n    legend_background=plotnine.element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n    legend_text=plotnine.element_text(color=INK_SOFT, size=16),\n    legend_title=plotnine.element_text(color=INK, size=16, weight=\"bold\"),\n    figure_size=(16, 9),\n)\n\nplot = (\n    plotnine.ggplot(data, plotnine.aes(x=\"Group\", y=\"Value\", fill=\"Group\"))\n    + plotnine.geom_violin(alpha=0.65, color=INK_SOFT, size=0.7, width=0.85)\n    + plotnine.geom_boxplot(\n        width=0.25, alpha=0.9, color=INK_SOFT, fill=ELEVATED_BG, size=0.6, outlier_size=4, outlier_alpha=0.7\n    )\n    + plotnine.scale_fill_manual(values=IMPRINT, name=\"Product\", guide=plotnine.guide_legend(nrow=1))\n    + plotnine.labs(title=\"violin-box · plotnine · anyplot.ai\", x=\"Product Category\", y=\"Satisfaction Score (points)\")\n    + anyplot_theme\n    + plotnine.theme(legend_position=\"top\", legend_direction=\"horizontal\")\n)\n\n# Save to script directory\nscript_dir = os.path.dirname(os.path.abspath(__file__))\noutput_path = os.path.join(script_dir, f\"plot-{THEME}.png\")\nplot.save(output_path, dpi=300, verbose=False)\n"}