{"spec_id":"line-confidence","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nline-confidence: Line Plot with Confidence Interval\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-05-09\n\"\"\"\n\nimport os\nimport pathlib\nimport sys\n\nimport numpy as np\nimport pandas as pd\n\n\nsys.path = [p for p in sys.path if pathlib.Path(p).resolve() != pathlib.Path.cwd().resolve()]\n\nfrom plotnine import (\n    aes,\n    element_line,\n    element_rect,\n    element_text,\n    geom_line,\n    geom_ribbon,\n    ggplot,\n    labs,\n    scale_color_manual,\n    scale_fill_manual,\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\nBRAND = \"#009E73\"  # Okabe-Ito position 1\n\n# Data: Simulated quarterly revenue forecast with 95% confidence interval\nnp.random.seed(42)\nquarters = np.arange(1, 21)\ntrend = 45 + 1.8 * quarters + 8 * np.sin(quarters * np.pi / 5)\nnoise = np.random.randn(20) * 2.5\ny = trend + noise\n\nbase_ci = 3.5\nci_growth = 0.25 * quarters\ny_lower = y - (base_ci + ci_growth)\ny_upper = y + (base_ci + ci_growth)\n\ndf = pd.DataFrame({\"Quarter\": quarters, \"Revenue\": y, \"Lower\": y_lower, \"Upper\": y_upper, \"Group\": \"forecast\"})\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"Quarter\"))\n    + geom_ribbon(aes(ymin=\"Lower\", ymax=\"Upper\", fill=\"Group\"), alpha=0.25)\n    + geom_line(aes(y=\"Revenue\", color=\"Group\"), size=1.4)\n    + scale_fill_manual(values={\"forecast\": BRAND}, labels={\"forecast\": \"95% Confidence Interval\"})\n    + scale_color_manual(values={\"forecast\": BRAND}, labels={\"forecast\": \"Revenue Forecast\"})\n    + labs(\n        x=\"Quarter (year-over-year)\",\n        y=\"Revenue ($ millions)\",\n        title=\"line-confidence · plotnine · anyplot.ai\",\n        fill=\"\",\n        color=\"\",\n    )\n    + theme_minimal()\n    + theme(\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_SOFT, size=0.3, alpha=0.10),\n        panel_grid_minor=element_line(color=INK_SOFT, size=0.2, alpha=0.05),\n        panel_border=element_rect(color=INK_SOFT, fill=None),\n        axis_title=element_text(color=INK, size=20),\n        axis_text=element_text(color=INK_SOFT, size=16),\n        axis_line=element_line(color=INK_SOFT),\n        plot_title=element_text(color=INK, size=24),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(color=INK_SOFT, size=16),\n        legend_position=\"right\",\n        figure_size=(16, 9),\n    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}