{"spec_id":"bar-permutation-importance","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nbar-permutation-importance: Permutation Feature Importance Plot\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 84/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    coord_flip,\n    element_line,\n    element_rect,\n    element_text,\n    geom_bar,\n    geom_errorbar,\n    geom_hline,\n    geom_text,\n    ggplot,\n    ggsave,\n    ggsize,\n    labs,\n    scale_fill_gradient,\n    scale_x_discrete,\n    theme,\n    theme_minimal,\n)\n\n\nLetsPlot.setup_html()\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\"\nINK_MUTED = \"#8A8A7E\" if THEME == \"light\" else \"#7A7970\"\n\n# Data: Simulated permutation importance from a Random Forest model\nnp.random.seed(42)\n\nfeatures = [\n    \"Income Level\",\n    \"Credit Score\",\n    \"Employment Years\",\n    \"Debt Ratio\",\n    \"Account Age\",\n    \"Payment History\",\n    \"Loan Amount\",\n    \"Interest Rate\",\n    \"Property Value\",\n    \"Monthly Expenses\",\n    \"Savings Balance\",\n    \"Number of Accounts\",\n    \"Recent Inquiries\",\n    \"Education Level\",\n    \"Region Code\",\n]\n\n# Generate importance values - higher for more predictive features\nbase_importance = np.array(\n    [0.15, 0.12, 0.09, 0.08, 0.06, 0.05, 0.04, 0.03, 0.025, 0.02, 0.015, 0.01, 0.008, 0.005, 0.002]\n)\n# Add some noise\nimportance_mean = base_importance + np.random.uniform(-0.005, 0.005, len(features))\nimportance_std = np.random.uniform(0.003, 0.02, len(features))\n\n# Create DataFrame and sort by importance\ndf = pd.DataFrame({\"feature\": features, \"importance_mean\": importance_mean, \"importance_std\": importance_std})\ndf = df.sort_values(\"importance_mean\", ascending=True).reset_index(drop=True)\n\n# Create ordered categorical for proper y-axis ordering\ndf[\"feature\"] = pd.Categorical(df[\"feature\"], categories=df[\"feature\"].tolist(), ordered=True)\n\n# Calculate error bar positions and label format\ndf[\"ymin\"] = df[\"importance_mean\"] - df[\"importance_std\"]\ndf[\"ymax\"] = df[\"importance_mean\"] + df[\"importance_std\"]\ndf[\"importance_pct\"] = (df[\"importance_mean\"] * 100).round(1).astype(str) + \"%\"\ndf[\"label\"] = df[\"importance_mean\"].round(4).astype(str)\n\n# Create the plot with enhanced letsplot-specific features\nplot = (\n    ggplot(df, aes(x=\"feature\", y=\"importance_mean\", fill=\"importance_mean\"))\n    + geom_bar(\n        stat=\"identity\",\n        width=0.75,\n        alpha=0.92,\n        tooltip=aes(text=\"<b>@feature</b><br/>Importance: @label<br/>±Std: @importance_std|.0000\"),\n    )\n    + geom_errorbar(aes(ymin=\"ymin\", ymax=\"ymax\"), width=0.3, size=1.0, color=INK_SOFT, alpha=0.8)\n    + geom_text(aes(y=\"importance_mean\", label=\"label\"), vjust=-0.6, size=12, color=INK_MUTED, family=\"monospace\")\n    + geom_hline(yintercept=0, color=INK_SOFT, size=0.9, linetype=\"dashed\", alpha=0.6)\n    + coord_flip()\n    + scale_fill_gradient(low=\"#FFD43B\", high=\"#306998\", guide=\"none\")\n    + scale_x_discrete()\n    + labs(x=\"Feature\", y=\"Mean Decrease in Model Score\", title=\"bar-permutation-importance · letsplot · anyplot.ai\")\n    + theme_minimal()\n    + theme(\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),\n        panel_grid_minor_x=element_line(color=INK_SOFT, size=0.15),\n        plot_title=element_text(size=24, color=INK, face=\"bold\"),\n        axis_title=element_text(size=20, color=INK, face=\"bold\"),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_text_y=element_text(size=14, color=INK_SOFT),\n    )\n    + ggsize(1600, 900)\n)\n\n# Save as PNG (scale 3x for 4800x2700)\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=3)\n\n# Save as HTML for interactive view\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}