{"spec_id":"violin-box","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\nviolin-box: Violin Plot with Embedded Box Plot\nLibrary: matplotlib 3.10.9 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nBRAND = \"#009E73\"\n\n# Data - Generate groups with different distributions\nnp.random.seed(42)\n\n# Four groups with varying distributions to showcase violin+box features\ngroup_a = np.random.normal(65, 8, 80)  # Symmetric\ngroup_b = np.concatenate([np.random.normal(45, 5, 40), np.random.normal(60, 5, 40)])  # Bimodal\ngroup_c = np.random.exponential(10, 80) + 30  # Right-skewed\ngroup_d = np.random.normal(55, 12, 80)  # Wide spread with outliers\ngroup_d = np.append(group_d, [95, 100, 15, 10])  # Add outliers\n\ndata = [group_a, group_b, group_c, group_d]\nlabels = [\"Control\", \"Treatment A\", \"Treatment B\", \"Treatment C\"]\n\n# Plot\nfig, ax = plt.subplots(figsize=(16, 9), facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\n\n# Plot violins\npositions = np.arange(1, len(data) + 1)\nviolin_parts = ax.violinplot(data, positions=positions, showmeans=False, showmedians=False, showextrema=False)\n\n# Style violins with brand color\nfor body in violin_parts[\"bodies\"]:\n    body.set_facecolor(BRAND)\n    body.set_edgecolor(INK_SOFT)\n    body.set_alpha(0.6)\n    body.set_linewidth(1.5)\n\n# Overlay box plots inside violins\nbox_parts = ax.boxplot(\n    data, positions=positions, widths=0.15, patch_artist=True, tick_labels=labels, showfliers=True, zorder=3\n)\n\n# Style box plots\nfor patch in box_parts[\"boxes\"]:\n    patch.set_facecolor(INK_SOFT)\n    patch.set_edgecolor(INK)\n    patch.set_linewidth(1.5)\n    patch.set_alpha(0.8)\n\nfor whisker in box_parts[\"whiskers\"]:\n    whisker.set_color(INK)\n    whisker.set_linewidth(1.5)\n\nfor cap in box_parts[\"caps\"]:\n    cap.set_color(INK)\n    cap.set_linewidth(1.5)\n\nfor median in box_parts[\"medians\"]:\n    median.set_color(INK)\n    median.set_linewidth(2.5)\n\nfor flier in box_parts[\"fliers\"]:\n    flier.set(marker=\"o\", markerfacecolor=BRAND, markeredgecolor=INK, markersize=6, alpha=0.7)\n\n# Style\nax.set_xlabel(\"Experimental Group\", fontsize=20, color=INK)\nax.set_ylabel(\"Response Value (units)\", fontsize=20, color=INK)\nax.set_title(\"violin-box · matplotlib · anyplot.ai\", fontsize=24, fontweight=\"medium\", color=INK)\nax.tick_params(axis=\"both\", labelsize=16, colors=INK_SOFT)\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nfor s in (\"left\", \"bottom\"):\n    ax.spines[s].set_color(INK_SOFT)\n    ax.spines[s].set_linewidth(1)\nax.yaxis.grid(True, alpha=0.10, linewidth=0.8, color=INK_SOFT)\n\n# Set y-axis range to accommodate all data\nax.set_ylim(0, 110)\n\nplt.tight_layout()\nplt.savefig(f\"plot-{THEME}.png\", dpi=300, bbox_inches=\"tight\", facecolor=PAGE_BG)\n"}