{"spec_id":"scatter-categorical","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nscatter-categorical: Categorical Scatter Plot\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 82/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\nimport sys\n\n\n# Prevent importing local pygal.py file\nsys.path = [p for p in sys.path if not p.endswith(\"/implementations/python\")]\n\nimport numpy as np\nimport pygal\nfrom pygal.style import Style\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\n# Okabe-Ito palette (first series = #009E73)\nIMPRINT = (\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\n# Data - Iris-like flower measurements by species\nnp.random.seed(42)\n\nspecies = [\"Setosa\", \"Versicolor\", \"Virginica\"]\nn_per_species = 40\n\n# Setosa: small petals (low x, low y)\nsetosa_x = np.random.normal(1.5, 0.25, n_per_species)\nsetosa_y = np.random.normal(0.3, 0.1, n_per_species)\n\n# Versicolor: medium petals (medium x, medium y)\nversicolor_x = np.random.normal(4.2, 0.6, n_per_species)\nversicolor_y = np.random.normal(1.3, 0.25, n_per_species)\n\n# Virginica: large petals (high x, high y)\nvirginica_x = np.random.normal(5.5, 0.6, n_per_species)\nvirginica_y = np.random.normal(2.0, 0.3, n_per_species)\n\n# Custom style for large canvas with theme support\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_SOFT,\n    colors=IMPRINT,\n    title_font_size=28,\n    label_font_size=22,\n    major_label_font_size=18,\n    legend_font_size=16,\n    value_font_size=14,\n    opacity=0.75,\n    opacity_hover=0.9,\n    stroke_width=2,\n    dots_size=8,\n)\n\n# Create XY scatter chart\nchart = pygal.XY(\n    width=4800,\n    height=2700,\n    style=custom_style,\n    title=\"scatter-categorical · pygal · anyplot.ai\",\n    x_title=\"Petal Length (cm)\",\n    y_title=\"Petal Width (cm)\",\n    show_x_guides=True,\n    show_y_guides=True,\n    legend_at_bottom=True,\n    legend_box_size=16,\n    truncate_legend=-1,\n)\n\n# Add data for each species as (x, y) tuples\nchart.add(\"Setosa\", list(zip(setosa_x, setosa_y, strict=True)))\nchart.add(\"Versicolor\", list(zip(versicolor_x, versicolor_y, strict=True)))\nchart.add(\"Virginica\", list(zip(virginica_x, virginica_y, strict=True)))\n\n# Save as PNG and HTML\nchart.render_to_png(f\"plot-{THEME}.png\")\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(chart.render())\n"}