{"spec_id":"box-horizontal","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nbox-horizontal: Horizontal Box Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 91/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    coord_flip,\n    element_line,\n    element_rect,\n    element_text,\n    geom_boxplot,\n    ggplot,\n    labs,\n    scale_fill_manual,\n    theme,\n    theme_minimal,\n)\n\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 - first series is always #009E73\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\"]\n\n# Data - Response times (ms) by service type\nnp.random.seed(42)\n\nservices = [\n    \"Authentication Service\",\n    \"Database Query Handler\",\n    \"File Storage API\",\n    \"Email Notification\",\n    \"Payment Gateway\",\n]\n\ndata = []\nfor service in services:\n    if service == \"Authentication Service\":\n        values = np.random.normal(120, 25, 80)\n    elif service == \"Database Query Handler\":\n        values = np.random.normal(85, 40, 80)\n        values = np.append(values, [220, 250, 280])\n    elif service == \"File Storage API\":\n        values = np.random.normal(200, 50, 80)\n    elif service == \"Email Notification\":\n        values = np.random.normal(150, 30, 80)\n    else:\n        values = np.random.normal(180, 60, 80)\n        values = np.append(values, [350, 380])\n\n    for v in values:\n        data.append({\"Service\": service, \"Response Time\": max(10, v)})\n\ndf = pd.DataFrame(data)\n\n# Sort by median response time for easier comparison\nmedians = df.groupby(\"Service\")[\"Response Time\"].median().sort_values()\ndf[\"Service\"] = pd.Categorical(df[\"Service\"], categories=medians.index, ordered=True)\n\n# Create horizontal box plot\nanyplot_theme = 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    panel_grid_major_y=element_line(color=INK, size=0.3, alpha=0.10),\n    panel_grid_major_x=element_line(color=INK, size=0.3, alpha=0.10),\n    panel_border=element_rect(color=INK_SOFT, fill=None, size=0.5),\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, size=0.5),\n    plot_title=element_text(size=24, color=INK),\n    legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n    legend_text=element_text(size=16, color=INK_SOFT),\n    legend_position=\"none\",\n)\n\nplot = (\n    ggplot(df, aes(x=\"Service\", y=\"Response Time\", fill=\"Service\"))\n    + geom_boxplot(alpha=0.8, size=0.8, outlier_size=3, outlier_alpha=0.7)\n    + coord_flip()\n    + scale_fill_manual(values=IMPRINT[: len(services)])\n    + labs(title=\"box-horizontal · plotnine · anyplot.ai\", x=\"Service Type\", y=\"Response Time (ms)\")\n    + theme_minimal()\n    + anyplot_theme\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}