{"spec_id":"radar-basic","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nradar-basic: Basic Radar Chart\nLibrary: seaborn 0.13.2 | Python 3.13.14\nQuality: 90/100 | Updated: 2026-07-24\n\"\"\"\n\nimport os\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\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\"\n\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\"]\n\nsns.set_theme(\n    style=\"ticks\",\n    rc={\n        \"figure.facecolor\": PAGE_BG,\n        \"axes.facecolor\": PAGE_BG,\n        \"axes.edgecolor\": INK_SOFT,\n        \"axes.labelcolor\": INK,\n        \"text.color\": INK,\n        \"xtick.color\": INK_SOFT,\n        \"ytick.color\": INK_SOFT,\n        \"grid.color\": INK_SOFT,\n        \"grid.alpha\": 0.15,\n        \"legend.facecolor\": ELEVATED_BG,\n        \"legend.edgecolor\": INK_SOFT,\n    },\n)\n\n# Data - product attribute comparison (0-100 scale, higher is better on every axis)\ncategories = [\"Price\", \"Quality\", \"Durability\", \"Usability\", \"Design\", \"Warranty\"]\nbudget_values = [90, 60, 65, 75, 55, 60]  # Budget Model\npremium_values = [45, 92, 85, 80, 90, 88]  # Premium Model\n\nn_vars = len(categories)\nangles = np.linspace(0, 2 * np.pi, n_vars, endpoint=False).tolist()\nangles += angles[:1]  # Close the polygon\n\nbudget_closed = budget_values + budget_values[:1]\npremium_closed = premium_values + premium_values[:1]\n\ncolor_budget = IMPRINT[0]  # #009E73 - Budget Model (first series)\ncolor_premium = IMPRINT[1]  # #C475FD - Premium Model\n\n# Plot - square canvas for symmetric radar chart (2400x2400 at 400 dpi)\nfig = plt.figure(figsize=(6, 6), dpi=400, facecolor=PAGE_BG)\ngrid = fig.add_gridspec(2, 1, height_ratios=[2.3, 1], hspace=0.4)\nax_radar = fig.add_subplot(grid[0], projection=\"polar\")\nax_bar = fig.add_subplot(grid[1])\nax_radar.set_facecolor(PAGE_BG)\nax_bar.set_facecolor(PAGE_BG)\n\nax_radar.set_theta_offset(np.pi / 2)\nax_radar.set_theta_direction(-1)\n\nax_radar.fill(angles, budget_closed, alpha=0.25, color=color_budget)\nax_radar.plot(angles, budget_closed, color=color_budget, linewidth=3, label=\"Budget Model\")\nax_radar.scatter(angles[:-1], budget_values, color=color_budget, s=60, zorder=5)\n\nax_radar.fill(angles, premium_closed, alpha=0.25, color=color_premium)\nax_radar.plot(angles, premium_closed, color=color_premium, linewidth=3, label=\"Premium Model\")\nax_radar.scatter(angles[:-1], premium_values, color=color_premium, s=60, zorder=5)\n\n# Style radar axes\nax_radar.set_xticks(angles[:-1])\nax_radar.set_xticklabels(categories, fontsize=10, color=INK, fontweight=\"medium\")\nax_radar.set_ylim(0, 100)\nax_radar.set_yticks([20, 40, 60, 80, 100])\nax_radar.set_yticklabels([\"20\", \"40\", \"60\", \"80\", \"100\"], fontsize=8, color=INK_SOFT)\nax_radar.set_rlabel_position(180 / n_vars)  # move radial ticks into a gap between two spokes\n\ngrid_alpha = 0.20 if THEME == \"light\" else 0.25\nax_radar.grid(True, alpha=grid_alpha, linestyle=\"-\", linewidth=1, color=INK_SOFT)\nax_radar.spines[\"polar\"].set_color(INK_SOFT)\nax_radar.spines[\"polar\"].set_alpha(0.4)\n\nlegend = ax_radar.legend(\n    loc=\"upper right\",\n    bbox_to_anchor=(1.32, 1.15),\n    fontsize=8,\n    framealpha=0.95,\n    facecolor=ELEVATED_BG,\n    edgecolor=INK_SOFT,\n)\nfor text in legend.get_texts():\n    text.set_color(INK)\n\n# Companion score breakdown - grouped horizontal bars via seaborn's high-level API\nscores = pd.DataFrame(\n    {\n        \"category\": categories * 2,\n        \"value\": budget_values + premium_values,\n        \"product\": [\"Budget Model\"] * n_vars + [\"Premium Model\"] * n_vars,\n    }\n)\nsns.barplot(\n    data=scores, x=\"value\", y=\"category\", hue=\"product\", palette=[color_budget, color_premium], legend=False, ax=ax_bar\n)\nax_bar.set_xlabel(\"Score\", fontsize=10, color=INK)\nax_bar.set_ylabel(\"\")\nax_bar.tick_params(axis=\"both\", labelsize=8, colors=INK_SOFT)\nax_bar.set_xlim(0, 100)\nax_bar.xaxis.grid(True, alpha=0.15, linewidth=0.8, color=INK_SOFT)\nax_bar.set_axisbelow(True)\nsns.despine(ax=ax_bar)\n\n# Title\nfig.suptitle(\"radar-basic · python · seaborn · anyplot.ai\", fontsize=12, fontweight=\"medium\", color=INK, y=0.97)\n\n# Save\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}