{"spec_id":"pdp-basic","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\npdp-basic: Partial Dependence Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 94/100 | Updated: 2026-05-15\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_line,\n    geom_ribbon,\n    geom_segment,\n    ggplot,\n    labs,\n    theme,\n    theme_minimal,\n)\nfrom sklearn.datasets import make_regression\nfrom sklearn.ensemble import GradientBoostingRegressor\nfrom sklearn.inspection import partial_dependence\n\n\n# Theme tokens\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\"  # Okabe-Ito position 1\nACCENT = \"#C475FD\"  # Okabe-Ito position 2 for rug\n\n# Data - Train a model and compute partial dependence\nnp.random.seed(42)\n\n# Generate synthetic data for a regression problem\nX, y = make_regression(n_samples=500, n_features=5, noise=10, random_state=42)\nfeature_names = [\"Energy Consumption\", \"Room Size\", \"Occupancy Rate\", \"Ventilation\", \"Age\"]\n\n# Train a gradient boosting model\nmodel = GradientBoostingRegressor(n_estimators=100, max_depth=3, random_state=42)\nmodel.fit(X, y)\n\n# Compute partial dependence for Room Size (feature index 1)\nfeature_idx = 1\n\n# Get partial dependence values\npd_results = partial_dependence(model, X, features=[feature_idx], kind=\"average\", grid_resolution=80)\ngrid_actual = pd_results[\"grid_values\"][0]\n\n# Compute ICE curves for confidence interval estimation\npd_individual = partial_dependence(model, X, features=[feature_idx], kind=\"individual\", grid_resolution=80)\nice_values = pd_individual[\"individual\"][0]\n\n# Calculate confidence interval (mean ± 1.96 * std for 95% CI)\npd_mean = ice_values.mean(axis=0)\npd_std = ice_values.std(axis=0)\nci_lower = pd_mean - 1.96 * pd_std\nci_upper = pd_mean + 1.96 * pd_std\n\n# Create DataFrame for plotting\ndf = pd.DataFrame(\n    {\"feature_value\": grid_actual, \"partial_dependence\": pd_mean, \"ci_lower\": ci_lower, \"ci_upper\": ci_upper}\n)\n\n# Rug data - sample of training data positioned at the axis baseline\ny_min = df[\"partial_dependence\"].min()\ny_max = df[\"partial_dependence\"].max()\nrug_height = (y_max - y_min) * 0.03\nrug_sample = pd.DataFrame({\"x\": X[:100, feature_idx], \"y\": y_min - rug_height, \"yend\": y_min})\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"feature_value\", y=\"partial_dependence\"))\n    + geom_ribbon(aes(ymin=\"ci_lower\", ymax=\"ci_upper\"), alpha=0.15, fill=BRAND, color=BRAND, size=0.5)\n    + geom_line(color=BRAND, size=2)\n    + geom_segment(data=rug_sample, mapping=aes(x=\"x\", xend=\"x\", y=\"y\", yend=\"yend\"), color=ACCENT, alpha=0.6, size=0.8)\n    + labs(\n        title=\"pdp-basic · plotnine · anyplot.ai\",\n        x=\"Room Size (standardized)\",\n        y=\"Partial Dependence (avg. prediction)\",\n    )\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_grid_major=element_line(color=INK_SOFT, size=0.3, alpha=0.10),\n        panel_grid_minor=element_blank(),\n        panel_border=element_rect(color=INK_SOFT, fill=None, size=0.5),\n        plot_title=element_text(size=24, weight=\"bold\", color=INK),\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    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}