{"spec_id":"bullet-basic","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nbullet-basic: Basic Bullet Chart\nLibrary: seaborn 0.13.2 | Python 3.13.13\nQuality: 89/100 | Updated: 2026-05-29\n\"\"\"\n\nimport os\n\nimport matplotlib.patches as mpatches\nimport matplotlib.pyplot as plt\nimport seaborn as sns\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# Imprint palette — semantic exception: green = on-track (pass), red = below-target (fail)\nON_TRACK_COLOR = \"#009E73\"  # Imprint position 1 — green maps to success/pass\nBELOW_TARGET_COLOR = \"#AE3030\"  # Imprint position 5 — matte red for fail/loss\n\n# Grayscale range bands (theme-adaptive) — spec recommends grayscale to focus attention on bars\nif THEME == \"light\":\n    BAND_GOOD = \"#CECDC7\"\n    BAND_SATISFACTORY = \"#AEADA6\"\n    BAND_POOR = \"#888780\"\nelse:\n    BAND_GOOD = \"#525250\"\n    BAND_SATISFACTORY = \"#3D3D3B\"\n    BAND_POOR = \"#353532\"  # lightened for better dark-mode band differentiation\n\n# Data — department KPI dashboard with varied performance scenarios\nmetrics = [\"Revenue\", \"Customer\\nSatisfaction\", \"Efficiency\", \"Quality\\nScore\"]\nactuals = [78, 85, 35, 91]\ntargets = [90, 80, 75, 85]\nranges_list = [\n    [50, 75, 100],  # Revenue\n    [60, 80, 100],  # Customer Satisfaction\n    [40, 60, 100],  # Efficiency\n    [70, 85, 100],  # Quality Score\n]\nstatus = [\"On Track\" if a >= t else \"Below Target\" for a, t in zip(actuals, targets, strict=True)]\nstatus_palette = {\"On Track\": ON_TRACK_COLOR, \"Below Target\": BELOW_TARGET_COLOR}\n\n# Configure seaborn theme with theme-adaptive chrome\nsns.set_theme(\n    style=\"ticks\",\n    rc={\n        \"figure.facecolor\": PAGE_BG,\n        \"axes.facecolor\": PAGE_BG,\n        \"axes.edgecolor\": INK_SOFT,\n        \"axes.labelcolor\": INK,\n        \"text.color\": INK,\n        \"xtick.color\": INK_SOFT,\n        \"ytick.color\": INK_SOFT,\n        \"grid.color\": INK,\n        \"grid.alpha\": 0.15,\n        \"legend.facecolor\": ELEVATED_BG,\n        \"legend.edgecolor\": INK_SOFT,\n    },\n)\n\nfig, ax = plt.subplots(figsize=(8, 4.5), dpi=400, facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\n\nn_metrics = len(metrics)\nrange_height = 0.65\nband_colors = [BAND_POOR, BAND_SATISFACTORY, BAND_GOOD]\n\n# Qualitative range bands via ax.barh for reliable left-offset positioning\nfor i, ranges in enumerate(ranges_list):\n    prev = 0\n    for end, color in zip(ranges, band_colors, strict=True):\n        ax.barh(i, end - prev, left=prev, height=range_height, color=color, edgecolor=\"none\", zorder=1)\n        prev = end\n\n# Actual value bars — seaborn-native barplot, narrower than background bands\nn_patches_before = len(ax.patches)\nsns.barplot(\n    y=list(range(n_metrics)),\n    x=actuals,\n    hue=status,\n    palette=status_palette,\n    width=0.28,\n    orient=\"h\",\n    ax=ax,\n    native_scale=True,\n    dodge=False,\n    errorbar=None,\n    saturation=1.0,\n    legend=False,\n)\nfor patch in ax.patches[n_patches_before:]:\n    patch.set_zorder(3)\n    patch.set_edgecolor(PAGE_BG)\n    patch.set_linewidth(0.8)\n\n# Target markers — thin vertical line spanning the full range-band height\nfor i, target in enumerate(targets):\n    ax.plot(\n        [target, target],\n        [i - range_height / 2 + 0.01, i + range_height / 2 - 0.01],\n        color=INK,\n        linewidth=2.5,\n        zorder=4,\n        solid_capstyle=\"butt\",\n    )\n\n# Value labels — positioned just past the actual bar, colored by status\nfor i, (actual, s) in enumerate(zip(actuals, status, strict=True)):\n    ax.text(\n        actual + 1.5, i, f\"{actual}%\", va=\"center\", ha=\"left\", fontsize=8, fontweight=\"bold\", color=status_palette[s]\n    )\n\n# Axes — title length 44 chars, ratio=1.0, title_fontsize=12\ntitle = \"bullet-basic · python · seaborn · anyplot.ai\"\nax.set_xlim(0, 115)\nax.set_ylim(-0.55, n_metrics - 0.45)\nax.set_xlabel(\"Performance (%)\", fontsize=10, color=INK)\nax.set_ylabel(\"\")\nax.set_title(title, fontsize=12, fontweight=\"medium\", color=INK, pad=12)\nax.set_yticks(range(n_metrics))\nyticklabels = ax.set_yticklabels(metrics, fontsize=8, color=INK_SOFT)\nfor i, lbl in enumerate(yticklabels):\n    if i == 2:  # Efficiency — most dramatic underperformance (35% vs 75% target)\n        lbl.set_fontweight(\"bold\")\n        lbl.set_color(BELOW_TARGET_COLOR)\nax.tick_params(axis=\"y\", length=0)\nax.tick_params(axis=\"x\", labelsize=8)\n\nsns.despine(left=True, top=True, right=True, ax=ax)\nax.xaxis.grid(True, alpha=0.15, linewidth=0.8, color=INK, zorder=2)\nax.yaxis.grid(False)\n\n# Legend\nlegend_elements = [\n    mpatches.Patch(facecolor=BAND_POOR, label=\"Poor\", edgecolor=\"none\"),\n    mpatches.Patch(facecolor=BAND_SATISFACTORY, label=\"Satisfactory\", edgecolor=\"none\"),\n    mpatches.Patch(facecolor=BAND_GOOD, label=\"Good\", edgecolor=\"none\"),\n    mpatches.Patch(facecolor=ON_TRACK_COLOR, label=\"On Track\", edgecolor=PAGE_BG, linewidth=0.8),\n    mpatches.Patch(facecolor=BELOW_TARGET_COLOR, label=\"Below Target\", edgecolor=PAGE_BG, linewidth=0.8),\n    plt.Line2D([0], [0], color=INK, linewidth=2.5, label=\"Target\"),\n]\nax.legend(\n    handles=legend_elements, loc=\"lower right\", fontsize=8, framealpha=0.9, facecolor=ELEVATED_BG, edgecolor=INK_SOFT\n)\n\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}