{"spec_id":"histogram-stacked","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nhistogram-stacked: Stacked Histogram\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 94/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\"\n\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\"]\n\n# Data - Test scores from three different study methods\nnp.random.seed(42)\n\nmethod_a = np.random.normal(loc=72, scale=10, size=150)\nmethod_b = np.random.normal(loc=78, scale=8, size=120)\nmethod_c = np.random.normal(loc=68, scale=12, size=100)\n\nmethod_a = np.clip(method_a, 0, 100)\nmethod_b = np.clip(method_b, 0, 100)\nmethod_c = np.clip(method_c, 0, 100)\n\ndf = pd.DataFrame(\n    {\n        \"Score\": np.concatenate([method_a, method_b, method_c]),\n        \"Study Method\": (\n            [\"Traditional Study\"] * len(method_a)\n            + [\"Active Recall\"] * len(method_b)\n            + [\"Passive Reading\"] * len(method_c)\n        ),\n    }\n)\n\n# Plot\nchart = (\n    alt.Chart(df)\n    .mark_bar(opacity=0.85, stroke=\"white\", strokeWidth=0.5)\n    .encode(\n        x=alt.X(\n            \"Score:Q\",\n            bin=alt.Bin(maxbins=20),\n            title=\"Test Score (points)\",\n            axis=alt.Axis(labelFontSize=18, titleFontSize=22),\n        ),\n        y=alt.Y(\n            \"count():Q\", title=\"Number of Students\", stack=\"zero\", axis=alt.Axis(labelFontSize=18, titleFontSize=22)\n        ),\n        color=alt.Color(\n            \"Study Method:N\",\n            scale=alt.Scale(domain=[\"Traditional Study\", \"Active Recall\", \"Passive Reading\"], range=IMPRINT),\n            legend=alt.Legend(title=\"Study Method\", titleFontSize=18, labelFontSize=16, orient=\"right\"),\n        ),\n        order=alt.Order(\"Study Method:N\", sort=\"ascending\"),\n    )\n    .properties(\n        width=1600,\n        height=900,\n        background=PAGE_BG,\n        title=alt.Title(\"histogram-stacked · altair · anyplot.ai\", fontSize=28, anchor=\"middle\"),\n    )\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT, strokeWidth=0.5)\n    .configure_axis(\n        domainColor=INK_SOFT, tickColor=INK_SOFT, gridColor=INK, gridOpacity=0.10, labelColor=INK_SOFT, titleColor=INK\n    )\n    .configure_title(color=INK, fontSize=28)\n    .configure_legend(fillColor=ELEVATED_BG, strokeColor=INK_SOFT, labelColor=INK_SOFT, titleColor=INK)\n)\n\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}