{"spec_id":"line-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nline-basic: Basic Line Plot\nLibrary: letsplot 4.10.1 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-06-03\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_area,\n    geom_line,\n    geom_point,\n    geom_smooth,\n    geom_text,\n    ggplot,\n    ggsize,\n    labs,\n    layer_tooltips,\n    scale_x_continuous,\n    theme,\n    theme_minimal,\n)\nfrom lets_plot.export import ggsave\n\n\nLetsPlot.setup_html()\n\n# Theme tokens (Imprint palette, theme-adaptive chrome)\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nRULE = \"rgba(26,26,23,0.15)\" if THEME == \"light\" else \"rgba(240,239,232,0.15)\"\nBRAND = \"#009E73\"\nAREA_ALPHA = 0.15 if THEME == \"light\" else 0.28  # stronger fill in dark for readability\n\nMONTH_NAMES = {\n    1: \"Jan\",\n    2: \"Feb\",\n    3: \"Mar\",\n    4: \"Apr\",\n    5: \"May\",\n    6: \"Jun\",\n    7: \"Jul\",\n    8: \"Aug\",\n    9: \"Sep\",\n    10: \"Oct\",\n    11: \"Nov\",\n    12: \"Dec\",\n}\n\n# Data — monthly temperature readings over a year\nnp.random.seed(42)\nmonths = np.arange(1, 13)\nbase_temp = 15 + 12 * np.sin((months - 4) * np.pi / 6)\ntemperature = base_temp + np.random.randn(12) * 1.5\n\ndf = pd.DataFrame({\"month\": months, \"temperature\": temperature})\ndf_peak = df.nlargest(1, \"temperature\").copy()\ndf_peak[\"label\"] = df_peak.apply(lambda r: f\"{MONTH_NAMES[int(r['month'])]}: {r['temperature']:.1f}°C\", axis=1)\n\n# Plot\ntitle = \"line-basic · python · letsplot · anyplot.ai\"\n\nanyplot_theme = theme(\n    plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n    panel_background=element_rect(fill=PAGE_BG),\n    panel_grid_major_y=element_line(color=RULE, size=0.5),\n    panel_grid_major_x=element_blank(),\n    panel_grid_minor=element_blank(),\n    axis_title=element_text(color=INK, size=12),\n    axis_text=element_text(color=INK_SOFT, size=10),\n    axis_line=element_line(color=INK_SOFT),\n    plot_title=element_text(color=INK, size=16),\n)\n\n# Richer tooltip: header title + formatted temperature value\ntooltips = (\n    layer_tooltips()\n    .title(\"Monthly Temperature\")\n    .format(\"@temperature\", \".1f\")\n    .line(\"Month: @month\")\n    .line(\"Temp: @temperature °C\")\n)\n\nplot = (\n    ggplot(df, aes(x=\"month\", y=\"temperature\"))\n    + geom_area(fill=BRAND, alpha=AREA_ALPHA)\n    # letsplot-distinctive: LOESS smooth shows the seasonal trend independent of the raw line\n    + geom_smooth(method=\"loess\", color=INK_SOFT, size=0.8, linetype=\"dashed\", se=False)\n    + geom_line(color=BRAND, size=1.5)\n    + geom_point(color=BRAND, size=4, alpha=0.9, tooltips=tooltips)\n    # Peak marker emphasis\n    + geom_point(data=df_peak, mapping=aes(x=\"month\", y=\"temperature\"), color=BRAND, size=7)\n    # Peak annotation label — makes the data narrative explicit\n    + geom_text(\n        data=df_peak,\n        mapping=aes(x=\"month\", y=\"temperature\", label=\"label\"),\n        color=INK,\n        size=4,\n        nudge_x=0.4,\n        nudge_y=0.9,\n    )\n    + labs(x=\"Month\", y=\"Temperature (°C)\", title=title)\n    + scale_x_continuous(breaks=list(range(1, 13)))\n    + ggsize(800, 450)\n    + theme_minimal()\n    + anyplot_theme\n)\n\n# Save\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}