{"spec_id":"violin-box","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nviolin-box: Violin Plot with Embedded Box Plot\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 83/100 | Updated: 2026-05-15\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import *\n\n\nLetsPlot.setup_html()\n\n# Data - Response times (ms) for different server configurations\nnp.random.seed(42)\n\nn_per_group = 150\ngroups = [\"Standard\", \"Optimized\", \"Premium\", \"Enterprise\"]\n\ndata = []\n# Standard: higher mean, moderate spread\ndata.extend([(np.random.normal(85, 15), \"Standard\") for _ in range(n_per_group)])\n# Optimized: lower mean, some outliers\nvals = np.concatenate([np.random.normal(55, 12, n_per_group - 5), np.random.normal(100, 5, 5)])\ndata.extend([(v, \"Optimized\") for v in vals])\n# Premium: bimodal distribution\nvals = np.concatenate([np.random.normal(40, 8, n_per_group // 2), np.random.normal(60, 8, n_per_group // 2)])\ndata.extend([(v, \"Premium\") for v in vals])\n# Enterprise: low mean, tight spread, few outliers\nvals = np.concatenate([np.random.normal(30, 6, n_per_group - 3), np.random.normal(70, 3, 3)])\ndata.extend([(v, \"Enterprise\") for v in vals])\n\ndf = pd.DataFrame(data, columns=[\"response_time\", \"configuration\"])\n\n# Create violin plot with embedded box plot\nplot = (\n    ggplot(df, aes(x=\"configuration\", y=\"response_time\", fill=\"configuration\"))\n    + geom_violin(alpha=0.7, color=\"#306998\", size=1.0, trim=False)\n    + geom_boxplot(width=0.15, fill=\"white\", color=\"#306998\", alpha=0.9, outlier_shape=21, outlier_size=3)\n    + scale_fill_manual(values=[\"#306998\", \"#FFD43B\", \"#4A90A4\", \"#7CB342\"])\n    + labs(x=\"Server Configuration\", y=\"Response Time (ms)\", title=\"violin-box · letsplot · pyplots.ai\")\n    + theme_minimal()\n    + theme(\n        plot_title=element_text(size=24, face=\"bold\"),\n        axis_title=element_text(size=20),\n        axis_text=element_text(size=16),\n        legend_position=\"none\",\n        panel_grid_major_x=element_blank(),\n        panel_grid_minor=element_blank(),\n    )\n    + ggsize(1600, 900)\n)\n\n# Save as PNG (scale 3x for 4800x2700 px)\nggsave(plot, \"plot.png\", path=\".\", scale=3)\n\n# Save as HTML for interactive version\nggsave(plot, \"plot.html\", path=\".\")\n"}