{"spec_id":"contour-decision-boundary","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\ncontour-decision-boundary: Decision Boundary Classifier Visualization\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 84/100 | Updated: 2026-05-16\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_blank,\n    element_text,\n    geom_point,\n    geom_tile,\n    ggplot,\n    guide_legend,\n    guides,\n    labs,\n    scale_color_manual,\n    scale_fill_manual,\n    theme,\n    theme_minimal,\n)\nfrom sklearn.datasets import make_moons\nfrom sklearn.svm import SVC\n\n\n# Data - Generate synthetic classification data\nnp.random.seed(42)\nX, y = make_moons(n_samples=200, noise=0.25, random_state=42)\n\n# Train classifier\nclf = SVC(kernel=\"rbf\", C=1.0, gamma=0.5)\nclf.fit(X, y)\n\n# Create mesh grid for decision boundary\nx_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5\ny_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5\nh = 0.02  # Step size\n\nxx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n\n# Predict on mesh grid\nZ = clf.predict(np.c_[xx.ravel(), yy.ravel()])\nZ = Z.reshape(xx.shape)\n\n# Create DataFrame for mesh grid (decision regions)\nmesh_df = pd.DataFrame({\"X1\": xx.ravel(), \"X2\": yy.ravel(), \"Prediction\": Z.ravel().astype(str)})\n\n# Create DataFrame for training points\npoints_df = pd.DataFrame({\"X1\": X[:, 0], \"X2\": X[:, 1], \"Class\": y.astype(str)})\n\n# Identify misclassified points\npredictions = clf.predict(X)\npoints_df[\"Correct\"] = predictions == y\npoints_df[\"Status\"] = points_df.apply(\n    lambda row: f\"Class {row['Class']}\" if row[\"Correct\"] else f\"Class {row['Class']} (misclassified)\", axis=1\n)\n\n# Color scheme\nregion_colors = {\"0\": \"#306998\", \"1\": \"#FFD43B\"}\npoint_colors = {\n    \"Class 0\": \"#1a3a5c\",\n    \"Class 1\": \"#b8960a\",\n    \"Class 0 (misclassified)\": \"#1a3a5c\",\n    \"Class 1 (misclassified)\": \"#b8960a\",\n}\n\n# Create plot\nplot = (\n    ggplot()\n    + geom_tile(data=mesh_df, mapping=aes(x=\"X1\", y=\"X2\", fill=\"Prediction\"), alpha=0.6)\n    + geom_point(data=points_df[points_df[\"Correct\"]], mapping=aes(x=\"X1\", y=\"X2\", color=\"Status\"), size=4, stroke=0.8)\n    + geom_point(\n        data=points_df[~points_df[\"Correct\"]],\n        mapping=aes(x=\"X1\", y=\"X2\", color=\"Status\"),\n        size=5,\n        stroke=1.5,\n        shape=\"X\",\n    )\n    + scale_fill_manual(values=region_colors, name=\"Predicted Region\")\n    + scale_color_manual(values=point_colors, name=\"Training Points\")\n    + labs(x=\"Feature X1\", y=\"Feature X2\", title=\"contour-decision-boundary · plotnine · pyplots.ai\")\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        plot_title=element_text(size=24, ha=\"center\"),\n        axis_title=element_text(size=20),\n        axis_text=element_text(size=16),\n        legend_title=element_text(size=18),\n        legend_text=element_text(size=14),\n        legend_position=\"right\",\n        panel_grid_major=element_blank(),\n        panel_grid_minor=element_blank(),\n    )\n    + guides(fill=guide_legend(override_aes={\"alpha\": 0.8}))\n)\n\n# Save\nplot.save(\"plot.png\", dpi=300, verbose=False)\n"}