{"spec_id":"area-stacked-percent","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\narea-stacked-percent: 100% Stacked Area Chart\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 83/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\nimport sys\n\n\nsys.path = [p for p in sys.path if p != os.path.dirname(__file__)]\n\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_line,\n    element_rect,\n    element_text,\n    geom_area,\n    ggplot,\n    labs,\n    scale_fill_manual,\n    scale_x_continuous,\n    scale_y_continuous,\n    theme,\n    theme_minimal,\n)\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 position is ALWAYS #009E73\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\"]\n\n# Data - Market share evolution with more dramatic proportion shifts\nyears = list(range(2015, 2025))\n\n# Generate category data with realistic and dramatic trends\nsmartphones = [50, 48, 44, 40, 35, 32, 28, 25, 22, 20]\ntablets = [28, 26, 22, 18, 15, 12, 10, 8, 6, 5]\nwearables = [4, 8, 14, 20, 26, 32, 38, 42, 46, 48]\nlaptops = [18, 18, 20, 22, 24, 24, 24, 25, 26, 27]\n\n# Create DataFrame in long format for plotnine\ndf_list = []\nfor i, year in enumerate(years):\n    total = smartphones[i] + tablets[i] + wearables[i] + laptops[i]\n    df_list.append(\n        {\"Year\": year, \"Category\": \"Smartphones\", \"Value\": smartphones[i], \"Percent\": smartphones[i] / total * 100}\n    )\n    df_list.append({\"Year\": year, \"Category\": \"Tablets\", \"Value\": tablets[i], \"Percent\": tablets[i] / total * 100})\n    df_list.append(\n        {\"Year\": year, \"Category\": \"Wearables\", \"Value\": wearables[i], \"Percent\": wearables[i] / total * 100}\n    )\n    df_list.append({\"Year\": year, \"Category\": \"Laptops\", \"Value\": laptops[i], \"Percent\": laptops[i] / total * 100})\n\ndf = pd.DataFrame(df_list)\n\n# Set category order for stacking\ndf[\"Category\"] = pd.Categorical(\n    df[\"Category\"], categories=[\"Smartphones\", \"Tablets\", \"Wearables\", \"Laptops\"], ordered=True\n)\n\n# Create plot\nplot = (\n    ggplot(df, aes(x=\"Year\", y=\"Percent\", fill=\"Category\"))\n    + geom_area(position=\"stack\", alpha=0.85)\n    + scale_fill_manual(values=IMPRINT)\n    + scale_x_continuous(breaks=range(2015, 2025, 2))\n    + scale_y_continuous(breaks=[0, 25, 50, 75, 100], labels=[\"0%\", \"25%\", \"50%\", \"75%\", \"100%\"])\n    + labs(\n        title=\"area-stacked-percent · plotnine · anyplot.ai\", x=\"Year\", y=\"Market Share (%)\", fill=\"Product Category\"\n    )\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major=element_line(color=INK, size=0.3, alpha=0.10),\n        panel_grid_minor=element_line(color=INK, size=0.2, alpha=0.05),\n        panel_border=element_rect(color=INK_SOFT, fill=None),\n        plot_title=element_text(size=24, weight=\"bold\", color=INK),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT, size=0.4),\n        legend_position=\"bottom\",\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(size=16, color=INK_SOFT),\n        legend_title=element_text(size=18, color=INK),\n    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}