{"spec_id":"pdp-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\npdp-basic: Partial Dependence Plot\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 100/100 | Updated: 2026-05-15\n\"\"\"\n\nimport os\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\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\"\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\n# Data - Train a model and compute partial dependence\nnp.random.seed(42)\nX, y = make_regression(n_samples=500, n_features=5, noise=10, random_state=42)\nfeature_names = [\"Temperature\", \"Pressure\", \"Humidity\", \"Flow Rate\", \"Duration\"]\n\n# Train gradient boosting model\nmodel = GradientBoostingRegressor(n_estimators=100, max_depth=4, random_state=42)\nmodel.fit(X, y)\n\n# Compute partial dependence for feature 0 (Temperature)\nfeature_idx = 0\ngrid_resolution = 80\npd_result = partial_dependence(model, X, features=[feature_idx], grid_resolution=grid_resolution, kind=\"average\")\n\n# Extract data\nfeature_values = pd_result[\"grid_values\"][0]\npd_values = pd_result[\"average\"][0]\n\n# Bootstrap for confidence intervals\nn_bootstrap = 50\nbootstrap_pds = []\nfor _ in range(n_bootstrap):\n    indices = np.random.choice(len(X), size=len(X), replace=True)\n    X_boot = X[indices]\n    pd_boot = partial_dependence(model, X_boot, features=[feature_idx], grid_resolution=grid_resolution, kind=\"average\")\n    bootstrap_pds.append(pd_boot[\"average\"][0])\n\nbootstrap_pds = np.array(bootstrap_pds)\nci_lower = np.percentile(bootstrap_pds, 2.5, axis=0)\nci_upper = np.percentile(bootstrap_pds, 97.5, axis=0)\n\n# Create DataFrame for main line\ndf_line = pd.DataFrame({\"Feature Value\": feature_values, \"Partial Dependence\": pd_values})\n\n# Create DataFrame for confidence band\ndf_band = pd.DataFrame({\"Feature Value\": feature_values, \"CI Lower\": ci_lower, \"CI Upper\": ci_upper})\n\n# Create rug plot data (sample of training data distribution)\nrug_sample = np.random.choice(X[:, feature_idx], size=min(100, len(X)), replace=False)\ndf_rug = pd.DataFrame(\n    {\"Feature Value\": rug_sample, \"y\": [pd_values.min() - (pd_values.max() - pd_values.min()) * 0.05] * len(rug_sample)}\n)\n\n# Confidence band\nband = (\n    alt.Chart(df_band)\n    .mark_area(opacity=0.2, color=BRAND)\n    .encode(\n        x=alt.X(\"Feature Value:Q\", title=f\"{feature_names[feature_idx]} (standardized units)\"),\n        y=alt.Y(\"CI Lower:Q\", title=\"Partial Dependence (predicted outcome)\"),\n        y2=\"CI Upper:Q\",\n    )\n)\n\n# Main PDP line\nline = (\n    alt.Chart(df_line)\n    .mark_line(strokeWidth=4, color=BRAND)\n    .encode(\n        x=alt.X(\"Feature Value:Q\"),\n        y=alt.Y(\"Partial Dependence:Q\"),\n        tooltip=[alt.Tooltip(\"Feature Value:Q\", format=\".2f\"), alt.Tooltip(\"Partial Dependence:Q\", format=\".2f\")],\n    )\n)\n\n# Rug plot for data distribution\nrug = alt.Chart(df_rug).mark_tick(thickness=2, size=20, color=BRAND, opacity=0.4).encode(x=alt.X(\"Feature Value:Q\"))\n\n# Combine layers\nchart = (\n    alt.layer(band, line, rug)\n    .properties(\n        width=1600,\n        height=900,\n        title=alt.Title(text=\"pdp-basic · altair · anyplot.ai\", fontSize=28, anchor=\"middle\"),\n        background=PAGE_BG,\n    )\n    .configure_view(fill=PAGE_BG, stroke=INK_SOFT)\n    .configure_axis(\n        domainColor=INK_SOFT,\n        tickColor=INK_SOFT,\n        gridColor=INK,\n        gridOpacity=0.10,\n        labelColor=INK_SOFT,\n        titleColor=INK,\n        labelFontSize=18,\n        titleFontSize=22,\n    )\n    .configure_title(color=INK)\n    .configure_legend(fillColor=ELEVATED_BG, strokeColor=INK_SOFT, labelColor=INK_SOFT, titleColor=INK)\n)\n\n# Save outputs\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.save(f\"plot-{THEME}.html\")\n"}