{"spec_id":"boxen-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nboxen-basic: Basic Boxen Plot (Letter-Value Plot)\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 79/100 | Updated: 2026-05-17\n\"\"\"\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Data - Generate server response times for different endpoints\nnp.random.seed(42)\n\nendpoints = [\"API Gateway\", \"Database\", \"Auth Service\", \"Cache\"]\ndata = []\n\nfor endpoint in endpoints:\n    if endpoint == \"API Gateway\":\n        # Slightly skewed distribution with outliers\n        values = np.concatenate(\n            [np.random.lognormal(mean=3.5, sigma=0.6, size=2000), np.random.uniform(150, 300, size=50)]\n        )\n    elif endpoint == \"Database\":\n        # Heavier tail distribution\n        values = np.random.lognormal(mean=4.0, sigma=0.8, size=2050)\n    elif endpoint == \"Auth Service\":\n        # Tighter distribution\n        values = np.concatenate(\n            [np.random.lognormal(mean=3.2, sigma=0.4, size=1900), np.random.uniform(80, 150, size=100)]\n        )\n    else:  # Cache - fastest\n        values = np.concatenate(\n            [np.random.lognormal(mean=2.5, sigma=0.5, size=1950), np.random.uniform(50, 100, size=100)]\n        )\n\n    for v in values:\n        data.append({\"Endpoint\": endpoint, \"Response Time (ms)\": v})\n\ndf = pd.DataFrame(data)\n\n# Build letter-value quantiles (k=6 levels: median, quartiles, eighths, etc.)\nk = 6\nquantile_levels = []\nfor i in range(k + 1):\n    if i == 0:\n        lower, upper = 0.5, 0.5  # median\n    else:\n        lower = 0.5 ** (i + 1)\n        upper = 1 - lower\n    quantile_levels.append((lower, upper, i))\n\n# Calculate letter values for each endpoint\nletter_value_data = []\noutlier_data = []\n\nfor endpoint in endpoints:\n    endpoint_data = df[df[\"Endpoint\"] == endpoint][\"Response Time (ms)\"].values\n\n    for lower_q, upper_q, level in quantile_levels:\n        lower_val = np.percentile(endpoint_data, lower_q * 100)\n        upper_val = np.percentile(endpoint_data, upper_q * 100)\n        median = np.median(endpoint_data)\n\n        letter_value_data.append(\n            {\"Endpoint\": endpoint, \"lower\": lower_val, \"upper\": upper_val, \"level\": level, \"median\": median}\n        )\n\n    # Identify outliers beyond the deepest level\n    deepest_lower = np.percentile(endpoint_data, 0.5 ** (k + 1) * 100)\n    deepest_upper = np.percentile(endpoint_data, (1 - 0.5 ** (k + 1)) * 100)\n\n    outliers = endpoint_data[(endpoint_data < deepest_lower) | (endpoint_data > deepest_upper)]\n    for out_val in outliers[:50]:\n        outlier_data.append({\"Endpoint\": endpoint, \"value\": out_val})\n\nlv_df = pd.DataFrame(letter_value_data)\noutlier_df = pd.DataFrame(outlier_data) if outlier_data else pd.DataFrame({\"Endpoint\": [], \"value\": []})\n\n# Create boxen plot using layered bars (width decreases with depth level)\nboxes = []\nfor level in range(k + 1):\n    level_df = lv_df[lv_df[\"level\"] == level].copy()\n    width = 80 - level * 10\n\n    box = (\n        alt.Chart(level_df)\n        .mark_bar(opacity=0.7 - level * 0.08, stroke=\"#306998\", strokeWidth=1)\n        .encode(\n            x=alt.X(\"Endpoint:N\", title=\"Endpoint\", axis=alt.Axis(labelFontSize=18, titleFontSize=22)),\n            y=alt.Y(\"lower:Q\", title=\"Response Time (ms)\", axis=alt.Axis(labelFontSize=18, titleFontSize=22)),\n            y2=alt.Y2(\"upper:Q\"),\n            color=alt.value(\"#306998\") if level == 0 else alt.value(\"#4A90C2\"),\n            size=alt.value(width),\n        )\n    )\n    boxes.append(box)\n\n# Median line\nmedian_df = lv_df[lv_df[\"level\"] == 0][[\"Endpoint\", \"median\"]].drop_duplicates()\n\nmedian_line = (\n    alt.Chart(median_df)\n    .mark_tick(thickness=4, color=\"#FFD43B\", size=60)\n    .encode(x=alt.X(\"Endpoint:N\"), y=alt.Y(\"median:Q\"))\n)\n\n# Outliers\nif len(outlier_df) > 0:\n    outliers_chart = (\n        alt.Chart(outlier_df)\n        .mark_point(size=80, color=\"#306998\", opacity=0.5, filled=True)\n        .encode(x=alt.X(\"Endpoint:N\"), y=alt.Y(\"value:Q\"))\n    )\nelse:\n    outliers_chart = alt.Chart(pd.DataFrame()).mark_point()\n\n# Combine layers\nchart = (\n    alt.layer(*boxes, median_line, outliers_chart)\n    .properties(\n        width=1600, height=900, title=alt.Title(\"boxen-basic · altair · pyplots.ai\", fontSize=28, anchor=\"middle\")\n    )\n    .configure_axis(labelFontSize=18, titleFontSize=22, grid=True, gridOpacity=0.3)\n    .configure_view(strokeWidth=0)\n)\n\n# Save\nchart.save(\"plot.png\", scale_factor=3.0)\nchart.save(\"plot.html\")\n"}