{"spec_id":"span-basic","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nspan-basic: Basic Span Plot (Highlighted Region)\nLibrary: seaborn 0.13.2 | Python 3.13.14\nQuality: 91/100 | Updated: 2026-07-25\n\"\"\"\n\nimport os\n\nimport matplotlib.dates as mdates\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\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# Imprint palette — canonical order, first series always #009E73\nIMPRINT_PALETTE = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\", \"#99B314\"]\nBRAND = IMPRINT_PALETTE[0]\nSPAN_RECESSION = IMPRINT_PALETTE[4]  # matte red — semantic anchor for a \"bad\" economic period\nSPAN_TARGET = IMPRINT_PALETTE[2]  # blue — neutral threshold band\n\nsns.set_theme(\n    style=\"ticks\",\n    rc={\n        \"figure.facecolor\": PAGE_BG,\n        \"axes.facecolor\": PAGE_BG,\n        \"axes.edgecolor\": INK_SOFT,\n        \"axes.labelcolor\": INK,\n        \"text.color\": INK,\n        \"xtick.color\": INK_SOFT,\n        \"ytick.color\": INK_SOFT,\n        \"grid.color\": INK,\n        \"grid.alpha\": 0.15,\n        \"legend.facecolor\": ELEVATED_BG,\n        \"legend.edgecolor\": INK_SOFT,\n    },\n)\n\n# Data - monthly sales revenue with the 2007-2009 recession and a target sales zone\nnp.random.seed(42)\nmonths = pd.date_range(start=\"2005-01\", periods=84, freq=\"ME\")\nrecession_start, recession_end = pd.Timestamp(\"2007-12-01\"), pd.Timestamp(\"2009-06-30\")\nin_recession = (months >= recession_start) & (months <= recession_end)\nbase_trend = np.linspace(95, 155, 84)\nrecession_effect = np.zeros(84)\nrecession_effect[in_recession] = -32 * np.sin(np.linspace(0, np.pi, in_recession.sum()))\nsales = base_trend + recession_effect + np.random.randn(84) * 7\ndf = pd.DataFrame({\"Month\": months, \"Sales\": sales})\n\n# Plot — see default-style-guide.md \"Visual Sizing Defaults\" for the canvas + sizing values\nfig, ax = plt.subplots(figsize=(8, 4.5), dpi=400, facecolor=PAGE_BG)\n\n# Vertical span — recession period, dashed edges mark the boundary precisely\nax.axvspan(recession_start, recession_end, alpha=0.22, color=SPAN_RECESSION, zorder=0)\nax.axvline(recession_start, color=SPAN_RECESSION, alpha=0.5, linewidth=1, linestyle=\"--\")\nax.axvline(recession_end, color=SPAN_RECESSION, alpha=0.5, linewidth=1, linestyle=\"--\")\n\n# Horizontal span — target sales zone\nax.axhspan(120, 140, alpha=0.22, color=SPAN_TARGET, zorder=0)\nax.axhline(120, color=SPAN_TARGET, alpha=0.4, linewidth=1, linestyle=\"--\")\nax.axhline(140, color=SPAN_TARGET, alpha=0.4, linewidth=1, linestyle=\"--\")\n\n# Line — semi-transparent spans keep it visible underneath\nsns.lineplot(data=df, x=\"Month\", y=\"Sales\", ax=ax, linewidth=2.5, color=BRAND)\n\n# Direct in-plot labels replace a legend — keeps the chart uncluttered\nax.set_xlim(months[0], months[-1])\ny_min, y_max = ax.get_ylim()\nax.text(\n    recession_start + (recession_end - recession_start) / 2,\n    y_max - 0.05 * (y_max - y_min),\n    \"Recession\",\n    rotation=90,\n    va=\"top\",\n    ha=\"center\",\n    fontsize=8,\n    fontweight=\"medium\",\n    color=SPAN_RECESSION,\n)\nax.text(months[2], 130, \"Target Zone\", va=\"center\", ha=\"left\", fontsize=8, fontweight=\"medium\", color=SPAN_TARGET)\n\n# Style\nax.set_title(\"span-basic · python · seaborn · anyplot.ai\", fontsize=12, fontweight=\"medium\", color=INK)\nax.set_xlabel(\"Date\", fontsize=10, color=INK)\nax.set_ylabel(\"Sales (thousands $)\", fontsize=10, color=INK)\nax.xaxis.set_major_locator(mdates.YearLocator())\nax.xaxis.set_major_formatter(mdates.DateFormatter(\"%Y\"))\nax.tick_params(axis=\"both\", labelsize=8, colors=INK_SOFT)\nsns.despine(ax=ax, offset=6)\nax.yaxis.grid(True, alpha=0.15, linewidth=0.8, color=INK)\n\nfig.subplots_adjust(left=0.10, right=0.97, top=0.88, bottom=0.14)\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}