{"spec_id":"bullet-basic","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nbullet-basic: Basic Bullet Chart\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 86/100 | Updated: 2026-05-29\n\"\"\"\n\nimport importlib.util\nimport os\nimport sys\nimport xml.etree.ElementTree as ET\n\nimport cairosvg\n\n\n# Guard against self-import: this file is named pygal.py, so a plain\n# `import pygal` picks up itself instead of the installed package.\npygal_spec = importlib.util.find_spec(\"pygal\")\nif pygal_spec and pygal_spec.origin != __file__:\n    import pygal\n    from pygal.style import Style\nelse:\n    _cwd = os.getcwd()\n    sys.path = [p for p in sys.path if os.path.abspath(p) != os.path.abspath(_cwd)]\n    try:\n        import pygal\n        from pygal.style import Style\n    finally:\n        sys.path.insert(0, _cwd)\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\n\n# Theme-adaptive chrome — Imprint palette\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Qualitative range band colors: warm-neutral grays, theme-adaptive\nif THEME == \"light\":\n    BAND_POOR = \"#E4E3DC\"\n    BAND_SAT = \"#C0BFB8\"\n    BAND_GOOD = \"#8E8D87\"\nelse:\n    BAND_POOR = \"#3A3A30\"\n    BAND_SAT = \"#484843\"\n    BAND_GOOD = \"#60605A\"\n\n# Imprint semantic anchors: green for at/above target, red for below\nCOLOR_ABOVE = \"#009E73\"  # brand green — at or above target\nCOLOR_BELOW = \"#AE3030\"  # matte red — below target\nCOLOR_TARGET = INK  # theme-adaptive neutral for target marker\n\n# Manufacturing & supply chain KPIs (7 metrics across ops domains)\nmetrics = [\n    {\"label\": \"On-Time Delivery\", \"actual\": 91, \"target\": 95, \"max\": 100, \"fmt\": \"{}%\"},\n    {\"label\": \"First Pass Yield\", \"actual\": 88, \"target\": 90, \"max\": 100, \"fmt\": \"{}%\"},\n    {\"label\": \"OEE\", \"actual\": 72, \"target\": 85, \"max\": 100, \"fmt\": \"{}%\"},\n    {\"label\": \"Inventory Turnover\", \"actual\": 8, \"target\": 10, \"max\": 12, \"fmt\": \"{}x\"},\n    {\"label\": \"Supplier On-Time\", \"actual\": 87, \"target\": 90, \"max\": 100, \"fmt\": \"{}%\"},\n    {\"label\": \"Capacity Utilization\", \"actual\": 82, \"target\": 80, \"max\": 100, \"fmt\": \"{}%\"},\n    {\"label\": \"Quality Score\", \"actual\": 94, \"target\": 92, \"max\": 100, \"fmt\": \"{}/100\"},\n]\n\nPOOR_PCT = 50\nSAT_PCT = 75\n\nactual_pcts = [round((m[\"actual\"] / m[\"max\"]) * 100, 1) for m in metrics]\ntarget_pcts = [round((m[\"target\"] / m[\"max\"]) * 100, 1) for m in metrics]\nabove_target = [m[\"actual\"] >= m[\"target\"] for m in metrics]\nlabels = [f\"{m['label']} ({m['fmt'].format(m['actual'])})\" for m in metrics]\n\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\n    font_family=\"DejaVu Sans, Helvetica, Arial, sans-serif\",\n    colors=(COLOR_ABOVE, COLOR_BELOW, COLOR_TARGET, BAND_POOR, BAND_SAT, BAND_GOOD),\n    title_font_size=66,\n    label_font_size=56,\n    major_label_font_size=44,\n    legend_font_size=44,\n    value_font_size=36,\n    stroke_width=2.5,\n)\n\nchart = pygal.HorizontalStackedBar(\n    width=3200,\n    height=1800,\n    title=\"bullet-basic · python · pygal · anyplot.ai\",\n    style=custom_style,\n    show_legend=True,\n    legend_at_bottom=True,\n    legend_box_size=26,\n    print_values=False,\n    print_zeroes=False,\n    show_y_guides=False,\n    show_x_guides=True,\n    margin=40,\n    spacing=0,\n    rounded_bars=2,\n    truncate_label=-1,\n    x_title=\"Performance (% of Maximum)\",\n    range=(0, 100),\n)\nchart.x_labels = labels\n\n# Legend-only placeholder series (serie-0/1/2): first series gets brand green (#009E73)\nchart.add(\"Above Target\", [None] * len(metrics))\nchart.add(\"Below Target\", [None] * len(metrics))\nchart.add(\"Target\", [None] * len(metrics))\n\n# Background bands: stacked segments for Poor / Satisfactory / Good zones (serie-3/4/5)\nchart.add(\"Poor (0–50%)\", [{\"value\": POOR_PCT, \"label\": lbl} for lbl in labels])\nchart.add(\"Satisfactory (50–75%)\", [{\"value\": SAT_PCT - POOR_PCT, \"label\": lbl} for lbl in labels])\nchart.add(\"Good (75–100%)\", [{\"value\": 100 - SAT_PCT, \"label\": lbl} for lbl in labels])\n\n# Parse rendered SVG for coordinate-space injection of actual bars and markers\nET.register_namespace(\"\", \"http://www.w3.org/2000/svg\")\nET.register_namespace(\"xlink\", \"http://www.w3.org/1999/xlink\")\nsvg_bytes = chart.render()\nroot = ET.fromstring(svg_bytes)\nNS = \"http://www.w3.org/2000/svg\"\n\nparent_map = {child: parent for parent in root.iter() for child in parent}\n\n# Make all stroked lines solid — style guide requires solid reference lines\nfor elem in root.iter():\n    if \"stroke-dasharray\" in elem.attrib:\n        del elem.attrib[\"stroke-dasharray\"]\n\n# serie-3 (Poor band) rects serve as the coordinate reference for injection\nserie_0 = next((g for g in root.iter(f\"{{{NS}}}g\") if \"serie-3\" in g.get(\"class\", \"\")), None)\n\npoor_bars = []\nif serie_0 is not None:\n    for rect in serie_0.iter(f\"{{{NS}}}rect\"):\n        w, h = float(rect.get(\"width\", \"0\")), float(rect.get(\"height\", \"0\"))\n        if w > 1 and h > 1:\n            poor_bars.append((float(rect.get(\"x\")), float(rect.get(\"y\")), w, h))\n\ninject_parent = parent_map.get(serie_0, root)\nfor i, (bx, by, bw, bh) in enumerate(poor_bars):\n    px_per_pct = bw / POOR_PCT\n    cy = by + bh / 2\n\n    # Actual value bar at 42% of band height (classic bullet chart layering)\n    actual_w = actual_pcts[i] * px_per_pct\n    bar_h = bh * 0.42\n    bar_color = COLOR_ABOVE if above_target[i] else COLOR_BELOW\n    a = ET.SubElement(inject_parent, f\"{{{NS}}}rect\")\n    a.set(\"x\", f\"{bx:.1f}\")\n    a.set(\"y\", f\"{cy - bar_h / 2:.1f}\")\n    a.set(\"width\", f\"{actual_w:.1f}\")\n    a.set(\"height\", f\"{bar_h:.1f}\")\n    a.set(\"fill\", bar_color)\n    a.set(\"rx\", \"2\")\n\n    # Target marker: prominent vertical rectangle at target percentage\n    tx = bx + target_pcts[i] * px_per_pct\n    marker_h = bh * 0.75\n    t = ET.SubElement(inject_parent, f\"{{{NS}}}rect\")\n    t.set(\"x\", f\"{tx - 6:.1f}\")\n    t.set(\"y\", f\"{cy - marker_h / 2:.1f}\")\n    t.set(\"width\", \"12\")\n    t.set(\"height\", f\"{marker_h:.1f}\")\n    t.set(\"fill\", COLOR_TARGET)\n\nsvg_modified = ET.tostring(root, encoding=\"utf-8\")\n\n# Save PNG at canonical 3200x1800 and interactive HTML\ncairosvg.svg2png(bytestring=svg_modified, write_to=f\"plot-{THEME}.png\")\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(svg_modified)\n"}