{"spec_id":"scatter-complex-plane","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\nscatter-complex-plane: Complex Plane Visualization (Argand Diagram)\nLibrary: matplotlib 3.10.9 | Python 3.13.13\nQuality: 89/100 | Created: 2026-06-02\n\"\"\"\n\nimport sys\n\n\nsys.path.pop(0)  # prevent this file from shadowing the matplotlib package\n\nimport os\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib.lines import Line2D\nfrom matplotlib.patches import Arc\n\n\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 = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Imprint palette — 8 hues, canonical order\nIMPRINT_PALETTE = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\", \"#99B314\"]\nCOLOR_ROOTS = IMPRINT_PALETTE[0]  # brand green — 5th roots of unity\nCOLOR_ARBIT = IMPRINT_PALETTE[1]  # lavender — arbitrary complex numbers\n\n# Data — 5th roots of unity (z^5 = 1) plus two arbitrary complex numbers\nn_roots = 5\nroots = [np.exp(2j * np.pi * k / n_roots) for k in range(n_roots)]\narbitrary = [1.6 + 0.7j, -0.4 + 1.5j]\n\nlabels_roots = [\"1\", \"ω\", \"ω²\", \"ω³\", \"ω⁴\"]\nlabels_arbit = [\"z₁\", \"z₂\"]\n\nall_points = roots + arbitrary\nall_labels = labels_roots + labels_arbit\nall_colors = [COLOR_ROOTS] * n_roots + [COLOR_ARBIT] * len(arbitrary)\nall_markers = [\"o\"] * n_roots + [\"D\"] * len(arbitrary)\n\n# Plot — square canvas required so the unit circle appears circular\nfig, ax = plt.subplots(figsize=(6, 6), dpi=400, facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\nax.set_aspect(\"equal\")\n\n# Unit circle — dashed geometric reference\ntheta = np.linspace(0, 2 * np.pi, 400)\nax.plot(np.cos(theta), np.sin(theta), color=INK_MUTED, linewidth=1.5, linestyle=\"--\", alpha=0.7, zorder=1)\n\n# Real and imaginary axes through the origin\nax.axhline(0, color=INK_SOFT, linewidth=0.9, alpha=0.6, zorder=1)\nax.axvline(0, color=INK_SOFT, linewidth=0.9, alpha=0.6, zorder=1)\n\n# Subtle grid for both axes\nax.xaxis.grid(True, alpha=0.12, linewidth=0.6, color=INK, zorder=0)\nax.yaxis.grid(True, alpha=0.12, linewidth=0.6, color=INK, zorder=0)\n\n# Arrows from origin to each complex number\nfor z, color in zip(all_points, all_colors, strict=False):\n    ax.annotate(\n        \"\",\n        xy=(z.real, z.imag),\n        xytext=(0.0, 0.0),\n        arrowprops={\"arrowstyle\": \"->\", \"color\": color, \"lw\": 1.8, \"mutation_scale\": 18, \"shrinkA\": 0, \"shrinkB\": 7},\n        zorder=3,\n    )\n\n# Angle arcs — dotted arcs from positive real axis to each vector, showing the argument\nfor z, color in zip(all_points, all_colors, strict=False):\n    angle_deg = np.degrees(np.angle(z))  # in [-180, 180]\n    if abs(angle_deg) > 0.5:\n        arc = Arc(\n            (0, 0),\n            0.38,\n            0.38,\n            angle=0,\n            theta1=min(0.0, angle_deg),\n            theta2=max(0.0, angle_deg),\n            color=color,\n            linewidth=0.9,\n            linestyle=\":\",\n            alpha=0.45,\n            zorder=2,\n        )\n        ax.add_patch(arc)\n\n# Scatter points\nfor z, color, marker in zip(all_points, all_colors, all_markers, strict=False):\n    ax.scatter(z.real, z.imag, s=130, color=color, marker=marker, edgecolors=PAGE_BG, linewidth=1.2, zorder=5)\n\n# Labels — name, rectangular form (a+bi), and polar form (|z|∠θ°), offset outward from origin\nfor z, label in zip(all_points, all_labels, strict=False):\n    re, im = z.real, z.imag\n    mag = abs(z) + 1e-12\n    angle_deg = np.degrees(np.angle(z)) % 360\n\n    if abs(im) < 1e-10:\n        coord = f\"{re:.2f}\"\n    elif im >= 0:\n        coord = f\"{re:.2f}+{im:.2f}i\"\n    else:\n        coord = f\"{re:.2f}{im:.2f}i\"\n\n    polar = f\"{abs(z):.2f}∠{angle_deg:.1f}°\"\n\n    dx = (re / mag) * 0.45\n    dy = (im / mag) * 0.45\n\n    ax.annotate(\n        f\"{label}\\n{coord}\\n{polar}\",\n        xy=(re, im),\n        xytext=(re + dx, im + dy),\n        fontsize=9,\n        color=INK,\n        ha=\"center\",\n        va=\"center\",\n        bbox={\"facecolor\": ELEVATED_BG, \"edgecolor\": \"none\", \"alpha\": 0.88, \"pad\": 3},\n        zorder=6,\n    )\n\n# Style\ntitle = \"scatter-complex-plane · python · matplotlib · anyplot.ai\"\nn_chars = len(title)\nratio = 67 / n_chars if n_chars > 67 else 1.0\ntitle_fontsize = max(8, round(12 * ratio))\n\nax.set_title(title, fontsize=title_fontsize, fontweight=\"medium\", color=INK, pad=10)\nax.set_xlabel(\"Real axis\", fontsize=10, color=INK)\nax.set_ylabel(\"Imaginary axis\", fontsize=10, color=INK)\nax.tick_params(axis=\"both\", labelsize=8, colors=INK_SOFT)\n\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nax.spines[\"left\"].set_color(INK_SOFT)\nax.spines[\"bottom\"].set_color(INK_SOFT)\n\nax.set_xlim(-2.4, 2.4)\nax.set_ylim(-2.4, 2.4)\n\n# Legend\nlegend_elements = [\n    Line2D(\n        [0],\n        [0],\n        marker=\"o\",\n        color=\"w\",\n        markerfacecolor=COLOR_ROOTS,\n        markersize=9,\n        label=\"5th roots of unity (ω = e^(2πi/5))\",\n    ),\n    Line2D(\n        [0], [0], marker=\"D\", color=\"w\", markerfacecolor=COLOR_ARBIT, markersize=9, label=\"Arbitrary complex numbers\"\n    ),\n    Line2D([0], [0], color=INK_MUTED, linewidth=1.5, linestyle=\"--\", label=\"Unit circle  |z| = 1\"),\n]\nleg = ax.legend(handles=legend_elements, fontsize=8, loc=\"lower left\", framealpha=0.9)\nleg.get_frame().set_facecolor(ELEVATED_BG)\nleg.get_frame().set_edgecolor(INK_SOFT)\nplt.setp(leg.get_texts(), color=INK_SOFT)\n\n# Save\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\nplt.close()\n"}