{"spec_id":"line-timeseries","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nline-timeseries: Time Series Line Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 92/100 | Updated: 2026-05-09\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom mizani.breaks import breaks_date\nfrom mizani.labels import label_date\nfrom plotnine import (\n    aes,\n    element_line,\n    element_rect,\n    element_text,\n    geom_line,\n    geom_point,\n    ggplot,\n    labs,\n    scale_x_datetime,\n    theme,\n    theme_minimal,\n)\n\n\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\"\nBRAND = \"#009E73\"\n\n# Data: Bitcoin prices over one year with explicit trend and volatility\nnp.random.seed(42)\ndates = pd.date_range(start=\"2023-01-01\", periods=365, freq=\"D\")\nprice = 16500.0\nprices = []\nfor i in range(365):\n    # Trend component: upward over the year, with mid-year dip\n    trend = 20000 + 15000 * np.sin(i / 365 * np.pi * 2) + i * 5\n    # Volatility: crypto is more volatile than stocks\n    volatility = price * (1 + np.random.randn() * 0.035)\n    # Mix trend and volatility\n    price = 0.7 * trend + 0.3 * volatility\n    prices.append(price)\n\ndf = pd.DataFrame({\"date\": dates, \"price\": prices})\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"date\", y=\"price\"))\n    + geom_line(color=BRAND, size=1.5, alpha=0.9)\n    + geom_point(color=BRAND, size=0.8, alpha=0.5)\n    + scale_x_datetime(breaks=breaks_date(30), labels=label_date(\"%b\"))\n    + labs(title=\"line-timeseries · plotnine · anyplot.ai\", x=\"Date\", y=\"Bitcoin Price (USD)\")\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, color=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        text=element_text(size=14, color=INK),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_text_x=element_text(angle=45, hjust=1),\n        plot_title=element_text(size=24, color=INK),\n    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300)\n"}