{"spec_id":"area-stacked","library":"plotly","language":"python","code":"\"\"\" anyplot.ai\narea-stacked: Stacked Area Chart\nLibrary: plotly 6.7.0 | Python 3.13.13\nQuality: 85/100 | Updated: 2026-05-07\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nimport plotly.graph_objects as go\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\"\nGRID = \"rgba(26,26,23,0.10)\" if THEME == \"light\" else \"rgba(240,239,232,0.10)\"\n\n# Okabe-Ito palette (first series is always brand green)\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\"]\n\n# Data - Monthly revenue by product category over 2 years\nnp.random.seed(42)\nmonths = pd.date_range(start=\"2023-01\", periods=24, freq=\"ME\")\n\n# Generate realistic revenue data with varied trends\nsoftware = 80000 + np.linspace(0, 20000, 24) + np.random.randn(24) * 3000\nservices = 60000 + np.linspace(0, 15000, 24) + np.random.randn(24) * 2500\nenterprise = 40000 + np.linspace(-5000, 10000, 24) + np.random.randn(24) * 2000\nconsulting = 25000 + np.linspace(0, -8000, 24) + np.random.randn(24) * 1500\n\n# Ensure positive values\nsoftware = np.maximum(software, 10000).astype(int)\nservices = np.maximum(services, 5000).astype(int)\nenterprise = np.maximum(enterprise, 5000).astype(int)\nconsulting = np.maximum(consulting, 3000).astype(int)\n\n# Create figure\nfig = go.Figure()\n\n# Add traces in order (largest at bottom)\nfig.add_trace(\n    go.Scatter(\n        x=months,\n        y=software,\n        name=\"Software\",\n        mode=\"lines\",\n        line=dict(width=0.5, color=IMPRINT[0]),\n        fill=\"tozeroy\",\n        fillcolor=IMPRINT[0],\n        stackgroup=\"one\",\n        hovertemplate=\"<b>Software</b><br>%{x|%b %Y}<br>Revenue: $%{y:,.0f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=months,\n        y=services,\n        name=\"Services\",\n        mode=\"lines\",\n        line=dict(width=0.5, color=IMPRINT[1]),\n        fill=\"tonexty\",\n        fillcolor=IMPRINT[1],\n        stackgroup=\"one\",\n        hovertemplate=\"<b>Services</b><br>%{x|%b %Y}<br>Revenue: $%{y:,.0f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=months,\n        y=enterprise,\n        name=\"Enterprise\",\n        mode=\"lines\",\n        line=dict(width=0.5, color=IMPRINT[2]),\n        fill=\"tonexty\",\n        fillcolor=IMPRINT[2],\n        stackgroup=\"one\",\n        hovertemplate=\"<b>Enterprise</b><br>%{x|%b %Y}<br>Revenue: $%{y:,.0f}<extra></extra>\",\n    )\n)\n\nfig.add_trace(\n    go.Scatter(\n        x=months,\n        y=consulting,\n        name=\"Consulting\",\n        mode=\"lines\",\n        line=dict(width=0.5, color=IMPRINT[3]),\n        fill=\"tonexty\",\n        fillcolor=IMPRINT[3],\n        stackgroup=\"one\",\n        hovertemplate=\"<b>Consulting</b><br>%{x|%b %Y}<br>Revenue: $%{y:,.0f}<extra></extra>\",\n    )\n)\n\n# Layout\nfig.update_layout(\n    title=dict(text=\"area-stacked · plotly · anyplot.ai\", font=dict(size=28, color=INK), x=0.5, xanchor=\"center\"),\n    xaxis=dict(\n        title=dict(text=\"Month\", font=dict(size=22, color=INK)),\n        tickfont=dict(size=18, color=INK_SOFT),\n        gridcolor=GRID,\n        showgrid=True,\n        showline=False,\n        zeroline=False,\n    ),\n    yaxis=dict(\n        title=dict(text=\"Monthly Revenue (USD)\", font=dict(size=22, color=INK)),\n        tickfont=dict(size=18, color=INK_SOFT),\n        gridcolor=GRID,\n        showgrid=True,\n        rangemode=\"tozero\",\n        showline=False,\n        zeroline=False,\n    ),\n    legend=dict(\n        font=dict(size=16, color=INK_SOFT),\n        bgcolor=ELEVATED_BG,\n        bordercolor=INK_SOFT,\n        borderwidth=1,\n        orientation=\"h\",\n        yanchor=\"bottom\",\n        y=1.02,\n        xanchor=\"center\",\n        x=0.5,\n    ),\n    paper_bgcolor=PAGE_BG,\n    plot_bgcolor=PAGE_BG,\n    margin=dict(l=100, r=50, t=120, b=100),\n    hovermode=\"x unified\",\n)\n\n# Save as PNG and HTML\nfig.write_image(f\"plot-{THEME}.png\", width=1600, height=900, scale=3)\nfig.write_html(f\"plot-{THEME}.html\", include_plotlyjs=\"cdn\")\n"}