{"spec_id":"waffle-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nwaffle-basic: Basic Waffle Chart\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 83/100 | Updated: 2026-05-05\n\"\"\"\n\nimport os\nimport sys\n\nimport pandas as pd\n\n\n# Fix import conflict: import from parent directory to avoid local module shadowing\noriginal_path = sys.path[:]\nsys.path = [p for p in sys.path if not p.endswith(\"python\")]\ntry:\n    import altair as alt\nfinally:\n    sys.path = original_path\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 (first series is #009E73)\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\n# Data - Budget allocation with 5 categories including a small one\ncategories = [\"Engineering\", \"Marketing\", \"Operations\", \"Design\", \"Legal\"]\nvalues = [40, 28, 18, 10, 4]  # Percentages (sum to 100)\n\n# Build 10x10 grid (100 squares, each = 1%)\nsquares = []\nsquare_idx = 0\nfor cat, val, color in zip(categories, values, IMPRINT, strict=True):\n    for _ in range(val):\n        row = square_idx // 10\n        col = square_idx % 10\n        squares.append({\"category\": cat, \"row\": row, \"col\": col, \"color\": color})\n        square_idx += 1\n\ndf = pd.DataFrame(squares)\n\n# Create waffle chart\nchart = (\n    alt.Chart(df)\n    .mark_rect(stroke=\"white\", strokeWidth=2, cornerRadius=4)\n    .encode(\n        x=alt.X(\"col:O\", axis=None),\n        y=alt.Y(\"row:O\", axis=None, sort=\"descending\"),\n        color=alt.Color(\n            \"category:N\",\n            scale=alt.Scale(domain=categories, range=IMPRINT),\n            legend=alt.Legend(\n                title=\"Category\",\n                titleFontSize=22,\n                labelFontSize=18,\n                symbolSize=300,\n                orient=\"right\",\n                labelExpr=\"datum.label + ' (' + {\"\n                + \", \".join([f\"'{cat}': '{val}%'\" for cat, val in zip(categories, values, strict=True)])\n                + \"}[datum.label] + ')'\",\n            ),\n        ),\n        tooltip=[\"category:N\"],\n    )\n    .properties(\n        width=1600,\n        height=900,\n        background=PAGE_BG,\n        title=alt.Title(\n            \"Budget Allocation · waffle-basic · altair · anyplot.ai\", fontSize=28, anchor=\"middle\", color=INK\n        ),\n    )\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT)\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\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}