{"spec_id":"donut-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\ndonut-basic: Basic Donut Chart\nLibrary: letsplot 4.10.1 | Python 3.13.14\nQuality: 91/100 | Updated: 2026-06-25\n\"\"\"\n\nimport os\n\nimport pandas as pd\nfrom lets_plot import *\nfrom lets_plot.export import ggsave as export_ggsave\n\n\nLetsPlot.setup_html()\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 — 5 slots for 5 department categories\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\n# Data — annual budget allocation by department ($M)\ncategories = [\"Marketing\", \"Operations\", \"R&D\", \"Sales\", \"HR\"]\nvalues = [28, 22, 25, 18, 7]\n\ndf = pd.DataFrame({\"category\": categories, \"value\": values})\ntotal = sum(values)\ndf[\"pct\"] = df[\"value\"] / total * 100\ndf[\"category\"] = pd.Categorical(df[\"category\"], categories=categories, ordered=True)\n# Explode the dominant segment to give it visual emphasis\ndf[\"explode\"] = [0.12 if c == \"Marketing\" else 0.0 for c in df[\"category\"]]\n\ncenter_df = pd.DataFrame({\"x\": [0.0], \"y\": [0.0], \"label\": [f\"Total\\n${total}M\"]})\n\n# Title: 46 chars < 67-char baseline → keep default size=16\nTITLE = \"donut-basic · python · letsplot · anyplot.ai\"\n\nplot = (\n    ggplot(df)\n    + geom_pie(\n        aes(slice=\"value\", fill=\"category\", explode=\"explode\"),\n        stat=\"identity\",\n        size=40,\n        hole=0.5,\n        labels=layer_labels()\n        .line(\"@pct\")\n        .format(\"pct\", \"{.1f}%\")\n        .size(11),\n    )\n    + geom_label(\n        aes(x=\"x\", y=\"y\", label=\"label\"),\n        data=center_df,\n        size=10,\n        color=INK,\n        fill=ELEVATED_BG,\n        label_padding=0.6,\n        label_r=0.2,\n    )\n    + scale_fill_manual(values=IMPRINT)\n    + labs(title=TITLE, fill=\"Department\")\n    + ggsize(600, 600)\n    + theme_void()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        plot_title=element_text(size=16, hjust=0.5, color=INK),\n        legend_title=element_text(size=12, color=INK),\n        legend_text=element_text(size=10, color=INK_SOFT),\n        legend_background=element_rect(fill=ELEVATED_BG, color=ELEVATED_BG),\n        legend_position=[0.85, 0.5],\n    )\n)\n\nexport_ggsave(plot, filename=f\"plot-{THEME}.png\", path=\".\", scale=4)\nexport_ggsave(plot, filename=f\"plot-{THEME}.html\", path=\".\")\n"}