{"spec_id":"donut-basic","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\ndonut-basic: Basic Donut Chart\nLibrary: matplotlib 3.11.0 | Python 3.13.14\nQuality: 90/100 | Updated: 2026-06-25\n\"\"\"\n\nimport os\n\nimport matplotlib.pyplot as plt\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\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Imprint palette — 8 hues, hybrid-v3 sort; first 5 positions for 5 categories\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\n# Data — annual budget allocation by department (USD thousands)\ncategories = [\"Engineering\", \"Marketing\", \"Operations\", \"Sales\", \"Support\"]\nvalues = [480, 210, 155, 125, 55]\ntotal = sum(values)\n\n# Square canvas for symmetric circular shapes: figsize=(6, 6) × dpi=400 → 2400×2400 px\nfig, ax = plt.subplots(figsize=(6, 6), dpi=400, facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\n\n# Slight explode on dominant Engineering segment for visual emphasis\nexplode = [0.03, 0, 0, 0, 0]\n\nwedges, _, autotexts = ax.pie(\n    values,\n    explode=explode,\n    autopct=\"%1.1f%%\",\n    startangle=90,\n    colors=IMPRINT,\n    wedgeprops={\"width\": 0.42, \"edgecolor\": PAGE_BG, \"linewidth\": 2},\n    pctdistance=0.78,\n)\n\n# Percentage labels sit on colored wedges — off-white for contrast in both themes\nfor autotext in autotexts:\n    autotext.set_fontsize(7.5)\n    autotext.set_color(\"#F0EFE8\")\n    autotext.set_fontweight(\"bold\")\n\n# Center metric: subtitle, thin rule, bold total\nax.text(0, 0.12, \"Total budget\", ha=\"center\", va=\"center\", fontsize=8, color=INK_SOFT)\nax.plot([-0.18, 0.18], [0.03, 0.03], color=INK_SOFT, linewidth=0.5, alpha=0.6)\nax.text(0, -0.10, f\"${total:,}K\", ha=\"center\", va=\"center\", fontsize=22, fontweight=\"bold\", color=INK)\n\nax.set_aspect(\"equal\")\n\ntitle = \"Budget by Department · donut-basic · python · matplotlib · anyplot.ai\"\nax.set_title(title, fontsize=12, fontweight=\"medium\", color=INK, pad=14)\n\n# Value-enriched legend: shows category names with absolute budget amounts\nlegend_labels = [f\"{cat}  ·  ${val:,}K\" for cat, val in zip(categories, values, strict=True)]\nleg = ax.legend(\n    wedges,\n    legend_labels,\n    loc=\"lower center\",\n    bbox_to_anchor=(0.5, -0.14),\n    ncol=3,\n    fontsize=8,\n    frameon=True,\n    handlelength=1.0,\n    handleheight=0.85,\n    handletextpad=0.5,\n    columnspacing=1.2,\n    borderpad=0.6,\n)\nleg.get_frame().set_facecolor(ELEVATED_BG)\nleg.get_frame().set_edgecolor(INK_SOFT)\nleg.get_frame().set_linewidth(0.5)\nplt.setp(leg.get_texts(), color=INK_SOFT)\n\nfig.subplots_adjust(left=0.05, right=0.95, top=0.9, bottom=0.2)\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}