{"spec_id":"histogram-kde","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nhistogram-kde: Histogram with KDE Overlay\nLibrary: plotnine 0.15.7 | Python 3.13.14\nQuality: 87/100 | Updated: 2026-08-05\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    after_stat,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_density,\n    geom_histogram,\n    geom_vline,\n    ggplot,\n    labs,\n    theme,\n    theme_minimal,\n)\n\n\n# Theme tokens (Imprint palette)\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\"\nBRAND = \"#009E73\"\n\n# Data - Stock daily returns (realistic financial data)\nnp.random.seed(42)\n# Simulate stock returns with slight negative skew and fat tails (realistic market behavior)\nreturns = np.concatenate(\n    [\n        np.random.normal(0.001, 0.015, 400),  # Normal trading days\n        np.random.normal(-0.02, 0.03, 80),  # Volatile periods\n        np.random.normal(0.005, 0.008, 120),  # Low volatility periods\n    ]\n)\nreturns = returns * 100  # Convert to percentage\n\ndf = pd.DataFrame({\"returns\": returns})\nmean_return = returns.mean()\n\n# Plot - Histogram with KDE overlay, mean marked for distributional context\nplot = (\n    ggplot(df, aes(x=\"returns\"))\n    + geom_histogram(aes(y=after_stat(\"density\")), bins=35, fill=BRAND, color=BRAND, alpha=0.5, size=0.2)\n    + geom_density(color=INK, size=1.1)\n    + geom_vline(xintercept=mean_return, color=INK_SOFT, linetype=\"dashed\", size=0.6)\n    + labs(x=\"Daily Return (%)\", y=\"Density\", title=\"histogram-kde · python · plotnine · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        figure_size=(8, 4.5),\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, size=0.3, alpha=0.15),\n        panel_grid_minor=element_line(color=INK, size=0.2, alpha=0.05),\n        panel_border=element_blank(),\n        axis_title=element_text(size=10, color=INK),\n        axis_text=element_text(size=8, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT, size=0.3),\n        plot_title=element_text(size=12, color=INK),\n        text=element_text(size=7),\n    )\n)\n\nplot.save(f\"plot-{THEME}.png\", dpi=400, width=8, height=4.5, units=\"in\")\n"}