{"spec_id":"box-horizontal","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nbox-horizontal: Horizontal Box Plot\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 87/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import *\n\n\nLetsPlot.setup_html()\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\"\nBRAND = \"#009E73\"  # Okabe-Ito position 1\n\n# Data - Response times by service type\nnp.random.seed(42)\n\nservices = [\"API Gateway\", \"Database Query\", \"Authentication\", \"File Storage\", \"Cache Lookup\", \"Email Service\"]\n\ndata = []\ndistributions = {\n    \"API Gateway\": (120, 40, 3),\n    \"Database Query\": (250, 100, 5),\n    \"Authentication\": (80, 25, 2),\n    \"File Storage\": (300, 80, 4),\n    \"Cache Lookup\": (15, 8, 2),\n    \"Email Service\": (180, 60, 6),\n}\n\nfor service in services:\n    mean, std, n_outliers = distributions[service]\n    values = np.random.normal(mean, std, 80)\n    outliers = np.random.normal(mean + 4 * std, std / 2, n_outliers)\n    all_values = np.concatenate([values, outliers])\n    all_values = np.maximum(all_values, 5)\n\n    for val in all_values:\n        data.append({\"Service\": service, \"Response Time (ms)\": val})\n\ndf = pd.DataFrame(data)\n\n# Create horizontal box plot\nplot = (\n    ggplot(df, aes(x=\"Response Time (ms)\", y=\"Service\"))\n    + geom_boxplot(\n        fill=BRAND, color=INK_SOFT, alpha=0.7, outlier_color=INK_SOFT, outlier_size=4, outlier_alpha=0.6, size=1.0\n    )\n    + labs(x=\"Response Time (ms)\", y=\"Service Type\", title=\"box-horizontal · letsplot · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_text_y=element_text(size=16, color=INK_SOFT),\n        plot_title=element_text(size=24, color=INK),\n        panel_grid_major_x=element_line(color=INK_SOFT, size=0.2),\n        panel_grid_major_y=element_blank(),\n        panel_grid_minor=element_blank(),\n        axis_line=element_line(color=INK_SOFT, size=0.5),\n    )\n    + ggsize(1600, 900)\n)\n\n# Save PNG (scale 3x to get 4800 x 2700 px)\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=3)\n\n# Save interactive HTML\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}