{"spec_id":"histogram-stepwise","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nhistogram-stepwise: Step Histogram\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\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\nnp.random.seed(42)\nvalues = np.concatenate([np.random.normal(25, 5, 300), np.random.normal(45, 8, 200)])\n\ncounts, bin_edges = np.histogram(values, bins=25)\n\nstep_x = []\nstep_y = []\nfor i, count in enumerate(counts):\n    step_x.extend([bin_edges[i], bin_edges[i + 1]])\n    step_y.extend([count, count])\n\nstep_x = [bin_edges[0]] + step_x + [bin_edges[-1]]\nstep_y = [0] + step_y + [0]\n\ndf = pd.DataFrame({\"Measurement Value\": step_x, \"Frequency\": step_y, \"order\": range(len(step_x))})\n\nchart = (\n    alt.Chart(df)\n    .mark_line(strokeWidth=3, color=BRAND, interpolate=\"step-after\")\n    .encode(\n        x=alt.X(\"Measurement Value:Q\", title=\"Measurement Value\"),\n        y=alt.Y(\"Frequency:Q\", title=\"Frequency\"),\n        order=\"order:O\",\n    )\n    .properties(\n        width=1600,\n        height=900,\n        background=PAGE_BG,\n        title=alt.Title(\"histogram-stepwise · altair · anyplot.ai\", fontSize=28),\n    )\n    .configure_axis(\n        domainColor=INK_SOFT,\n        domainOpacity=1,\n        tickColor=INK_SOFT,\n        gridColor=INK,\n        gridOpacity=0.06,\n        labelColor=INK_SOFT,\n        labelFontSize=18,\n        titleColor=INK,\n        titleFontSize=22,\n        labelPadding=10,\n        titlePadding=12,\n    )\n    .configure_axisBottom(domainColor=INK_SOFT, domainOpacity=1, domainWidth=1.5)\n    .configure_axisLeft(domainColor=INK_SOFT, domainOpacity=1, domainWidth=1.5)\n    .configure_axisRight(domainOpacity=0)\n    .configure_axisTop(domainOpacity=0)\n    .configure_title(color=INK, fontSize=28, anchor=\"start\", offset=16)\n    .configure_view(strokeWidth=0, fill=PAGE_BG)\n)\n\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}