{"spec_id":"line-stepwise","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nline-stepwise: Step Line Plot\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 85/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import *\nfrom lets_plot import element_blank, element_line, element_rect, element_text, theme\nfrom lets_plot.export import ggsave as export_ggsave\n\n\nLetsPlot.setup_html()\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\"\n\n# Data - Server Response Time Monitor (discrete state changes)\nnp.random.seed(42)\nhours = np.arange(0, 24)\n\n# Response time that changes in steps (server performance states)\nbase_response = 50\nresponse_times = [base_response]\n\nfor i in range(1, 24):\n    if i in [6, 9, 12, 15, 18, 21]:\n        change = np.random.choice([-20, -10, 10, 20, 30])\n        new_val = max(20, min(150, response_times[-1] + change))\n        response_times.append(new_val)\n    else:\n        response_times.append(response_times[-1])\n\nresponse_times = np.array(response_times)\ndf = pd.DataFrame({\"hour\": hours, \"response_time\": response_times})\n\n# Theme-adaptive plot styling\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=element_line(color=INK_SOFT, size=0.3),\n    panel_grid_minor=element_blank(),\n    axis_title=element_text(size=20, color=INK),\n    axis_text=element_text(size=16, color=INK_SOFT),\n    axis_line=element_line(color=INK_SOFT, size=0.5),\n    plot_title=element_text(size=24, color=INK),\n)\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"hour\", y=\"response_time\"))\n    + geom_step(color=BRAND, size=2, direction=\"hv\")\n    + geom_point(\n        data=df[df[\"hour\"].isin([6, 9, 12, 15, 18, 21])], color=BRAND, size=5, shape=21, fill=BRAND, stroke=1.5\n    )\n    + labs(\n        x=\"Hour of Day\", y=\"Response Time (ms)\", title=\"line-stepwise · letsplot · anyplot.ai\"\n    )\n    + scale_x_continuous(breaks=list(range(0, 25, 3)))\n    + scale_y_continuous(expand=[0.05, 0.05])\n    + theme_minimal()\n    + anyplot_theme\n    + theme(legend_position=\"none\")\n    + ggsize(1600, 900)\n)\n\n# Save PNG and HTML with theme suffix\nexport_ggsave(plot, filename=f\"plot-{THEME}.png\", path=\".\", scale=3)\nexport_ggsave(plot, filename=f\"plot-{THEME}.html\", path=\".\")\n"}