{"spec_id":"line-timeseries-rolling","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nline-timeseries-rolling: Time Series with Rolling Average Overlay\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\nimport random\nfrom datetime import datetime, timedelta\n\nimport pygal\nfrom pygal.style import Style\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Okabe-Ito palette: first series is brand green\nIMPRINT = (\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\n# Seed for reproducibility\nrandom.seed(42)\n\n# Generate daily temperature readings for 4 months\nstart_date = datetime(2024, 1, 1)\ndates = [start_date + timedelta(days=i) for i in range(120)]\n\n# Generate temperature data with seasonal trend and noise\ntemperatures = []\nfor i in range(120):\n    seasonal = 5 + 8 * (i / 120)\n    noise = random.gauss(0, 3)\n    temp = seasonal + noise\n    temperatures.append(round(temp, 1))\n\n# Calculate 7-day rolling average\nwindow_size = 7\nrolling_avg = []\nfor i in range(len(temperatures)):\n    if i < window_size - 1:\n        rolling_avg.append(None)\n    else:\n        window = temperatures[i - window_size + 1 : i + 1]\n        avg = sum(window) / window_size\n        rolling_avg.append(round(avg, 1))\n\n# Custom style with theme-adaptive tokens\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\n    colors=IMPRINT,\n    title_font_size=28,\n    label_font_size=22,\n    major_label_font_size=18,\n    legend_font_size=16,\n    value_font_size=14,\n    stroke_width=3,\n)\n\n# Create line chart with grid on both axes\nchart = pygal.Line(\n    width=4800,\n    height=2700,\n    style=custom_style,\n    title=\"line-timeseries-rolling · pygal · anyplot.ai\",\n    x_title=\"Date\",\n    y_title=\"Temperature (°C)\",\n    show_x_guides=True,\n    show_y_guides=True,\n    x_label_rotation=45,\n    show_legend=True,\n    legend_at_bottom=True,\n)\n\n# Add raw temperature data (thinner line)\nchart.add(\"Raw Temperature\", temperatures, stroke_style={\"width\": 2})\n\n# Add rolling average (prominent line)\nchart.add(\"7-Day Rolling Average\", rolling_avg, stroke_style={\"width\": 6})\n\n# Set x-axis labels - show every 2 weeks\nx_labels = []\nfor d in dates:\n    if d.day in [1, 15]:\n        x_labels.append(d.strftime(\"%b %d\"))\n    else:\n        x_labels.append(\"\")\n\nchart.x_labels = x_labels\n\n# Save as theme-suffixed PNG and HTML\nchart.render_to_png(f\"plot-{THEME}.png\")\nchart.render_to_file(f\"plot-{THEME}.html\")\n"}