{"spec_id":"bar-stacked-labeled","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nbar-stacked-labeled: Stacked Bar Chart with Total Labels\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 89/100 | Updated: 2026-05-18\n\"\"\"\n\nimport os\nimport sys\n\n\n# Remove current directory from path to avoid shadowing altair library\nsys.path = [p for p in sys.path if not p.endswith(\"/python\")]\n\nimport altair as alt\nimport pandas as pd\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\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\"]\n\n# Data - Quarterly revenue by product category\ndata = pd.DataFrame(\n    {\n        \"quarter\": [\"Q1\", \"Q1\", \"Q1\", \"Q2\", \"Q2\", \"Q2\", \"Q3\", \"Q3\", \"Q3\", \"Q4\", \"Q4\", \"Q4\"],\n        \"product\": [\"Software\", \"Hardware\", \"Services\"] * 4,\n        \"revenue\": [120, 85, 45, 145, 92, 58, 165, 88, 72, 185, 95, 80],\n    }\n)\n\n# Calculate totals for labels\ntotals = data.groupby(\"quarter\")[\"revenue\"].sum().reset_index()\ntotals.columns = [\"quarter\", \"total\"]\ntotals[\"label\"] = totals[\"total\"].apply(lambda x: f\"${x}K\")\n\n# Create stacked bar chart with enhanced styling\nbars = (\n    alt.Chart(data)\n    .mark_bar(strokeWidth=2, stroke=\"white\", opacity=0.95)\n    .encode(\n        x=alt.X(\"quarter:N\", title=\"Quarter\", axis=alt.Axis(labelFontSize=18, titleFontSize=22)),\n        y=alt.Y(\"revenue:Q\", title=\"Revenue ($K)\", axis=alt.Axis(labelFontSize=18, titleFontSize=22)),\n        color=alt.Color(\n            \"product:N\",\n            title=\"Product\",\n            scale=alt.Scale(domain=[\"Software\", \"Hardware\", \"Services\"], range=IMPRINT),\n            legend=alt.Legend(titleFontSize=20, labelFontSize=18, symbolSize=300),\n        ),\n        order=alt.Order(\"product:N\", sort=\"ascending\"),\n        tooltip=[\"quarter:N\", \"product:N\", \"revenue:Q\"],\n    )\n)\n\n# Total labels with improved styling for emphasis\nlabels = (\n    alt.Chart(totals)\n    .mark_text(fontSize=24, fontWeight=\"bold\", dy=-20, color=INK, align=\"center\")\n    .encode(x=alt.X(\"quarter:N\"), y=alt.Y(\"total:Q\"), text=\"label:N\")\n)\n\n# Add visual hierarchy with a subtle reference line at average total\navg_total = totals[\"total\"].mean()\nreference_line = (\n    alt.Chart(pd.DataFrame({\"avg\": [avg_total]}))\n    .mark_rule(color=INK_SOFT, opacity=0.2, strokeWidth=2, strokeDash=[5, 5])\n    .encode(y=alt.Y(\"avg:Q\"))\n)\n\n# Combine and configure\nchart = (\n    (reference_line + bars + labels)\n    .properties(\n        width=1600,\n        height=900,\n        background=PAGE_BG,\n        title=alt.Title(\"bar-stacked-labeled · Python · altair · anyplot.ai\", fontSize=28, anchor=\"middle\", color=INK),\n    )\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT, strokeWidth=1)\n    .configure_axis(\n        domainColor=INK_SOFT, tickColor=INK_SOFT, gridColor=INK, gridOpacity=0.10, labelColor=INK_SOFT, titleColor=INK\n    )\n    .configure_title(color=INK)\n    .configure_legend(fillColor=ELEVATED_BG, strokeColor=INK_SOFT, labelColor=INK_SOFT, titleColor=INK)\n)\n\n# Save outputs\nscript_dir = os.path.dirname(os.path.abspath(__file__))\nchart.save(os.path.join(script_dir, f\"plot-{THEME}.png\"), scale_factor=3.0)\nchart.save(os.path.join(script_dir, f\"plot-{THEME}.html\"))\n"}