{"spec_id":"scatter-text","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nscatter-text: Scatter Plot with Text Labels Instead of Points\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import aes, element_line, element_rect, element_text, geom_text, ggplot, labs, scale_color_manual, theme\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\n# Okabe-Ito palette (categorical data only)\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\"]\n\n# Data: Simulated 2D projection of programming language embeddings\nnp.random.seed(42)\n\nlanguages = [\n    # Object-oriented / General purpose\n    (\"Python\", -1.2, 2.1, \"General\"),\n    (\"Java\", -0.8, 1.5, \"General\"),\n    (\"C#\", -0.5, 1.3, \"General\"),\n    (\"Ruby\", -1.5, 1.8, \"General\"),\n    (\"Kotlin\", -0.3, 1.6, \"General\"),\n    # Systems / Low-level\n    (\"C\", 2.0, -0.5, \"Systems\"),\n    (\"C++\", 1.8, 0.2, \"Systems\"),\n    (\"Rust\", 1.5, 0.8, \"Systems\"),\n    (\"Go\", 1.2, 1.0, \"Systems\"),\n    (\"Zig\", 2.2, -0.2, \"Systems\"),\n    # Functional\n    (\"Haskell\", -2.0, -1.5, \"Functional\"),\n    (\"Scala\", -1.0, -0.5, \"Functional\"),\n    (\"Clojure\", -1.8, -1.0, \"Functional\"),\n    (\"F#\", -0.7, -0.8, \"Functional\"),\n    (\"Erlang\", -2.2, -1.2, \"Functional\"),\n    # Web / Scripting\n    (\"JavaScript\", 0.5, 2.5, \"Web\"),\n    (\"TypeScript\", 0.3, 2.2, \"Web\"),\n    (\"PHP\", 0.8, 1.8, \"Web\"),\n    (\"Perl\", 1.0, 1.2, \"Web\"),\n    (\"Lua\", 1.5, 1.5, \"Web\"),\n    # Data / Scientific\n    (\"R\", -1.8, 0.5, \"Data\"),\n    (\"Julia\", -0.2, 0.3, \"Data\"),\n    (\"MATLAB\", -1.5, 0.2, \"Data\"),\n    (\"SQL\", 0.2, -1.5, \"Data\"),\n    (\"SAS\", -1.2, -0.3, \"Data\"),\n]\n\ndf = pd.DataFrame(languages, columns=[\"label\", \"x\", \"y\", \"category\"])\ndf[\"x\"] = df[\"x\"] + np.random.normal(0, 0.1, len(df))\ndf[\"y\"] = df[\"y\"] + np.random.normal(0, 0.1, len(df))\n\n# Map categories to Okabe-Ito colors\ncategory_colors = {\n    \"General\": IMPRINT[0],\n    \"Systems\": IMPRINT[1],\n    \"Functional\": IMPRINT[2],\n    \"Web\": IMPRINT[3],\n    \"Data\": IMPRINT[4],\n}\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"x\", y=\"y\", label=\"label\", color=\"category\"))\n    + geom_text(size=11, alpha=0.9, fontweight=\"bold\")\n    + labs(\n        x=\"Dimension 1 (Paradigm Similarity)\",\n        y=\"Dimension 2 (Abstraction Level)\",\n        title=\"scatter-text · Python · plotnine · anyplot.ai\",\n        color=\"Category\",\n    )\n    + scale_color_manual(values=category_colors)\n    + theme(\n        figure_size=(16, 9),\n        dpi=300,\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major=element_line(color=INK, size=0.3, alpha=0.15),\n        panel_grid_minor=element_line(color=INK, size=0.2, alpha=0.08),\n        panel_border=element_rect(color=INK_SOFT, fill=None, size=0.4),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT, size=0.4),\n        plot_title=element_text(size=24, color=INK, ha=\"left\"),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_text=element_text(size=16, color=INK_SOFT),\n        legend_title=element_text(size=18, color=INK),\n        legend_position=\"right\",\n    )\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300, verbose=False)\n"}