{"spec_id":"polar-scatter","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\npolar-scatter: Polar Scatter Plot\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 84/100 | Created: 2026-05-09\n\"\"\"\n\n# Ensure we import the installed pygal package, not this file\nimport importlib.util\nimport os\nimport sys\n\nimport numpy as np\n\n\npygal_spec = importlib.util.find_spec(\"pygal\")\nif pygal_spec and pygal_spec.origin != __file__:\n    import pygal\n    from pygal.style import Style\nelse:\n    # Fallback: remove current directory from path temporarily\n    cwd = os.getcwd()\n    sys.path = [p for p in sys.path if os.path.abspath(p) != cwd]\n    try:\n        import pygal\n        from pygal.style import Style\n    finally:\n        sys.path.insert(0, cwd)\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\nIMPRINT = (\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\n# Data: Wind observations with direction and speed\nnp.random.seed(42)\nn_morning = 35\nn_afternoon = 40\nn_evening = 35\n\n# Morning: winds from NW (around 315°)\nmorning_angles = np.random.normal(315, 30, n_morning) % 360\nmorning_speeds = np.random.uniform(6, 15, n_morning)\n\n# Afternoon: winds from N-NE (around 45°)\nafternoon_angles = np.random.normal(45, 35, n_afternoon) % 360\nafternoon_speeds = np.random.uniform(8, 18, n_afternoon)\n\n# Evening: winds from S (around 180°)\nevening_angles = np.random.normal(180, 25, n_evening) % 360\nevening_speeds = np.random.uniform(5, 12, n_evening)\n\nangles = np.concatenate([morning_angles, afternoon_angles, evening_angles])\nspeeds = np.concatenate([morning_speeds, afternoon_speeds, evening_speeds])\ncategories = [\"morning\"] * n_morning + [\"afternoon\"] * n_afternoon + [\"evening\"] * n_evening\n\n# Convert polar to Cartesian coordinates\nradians = np.radians(angles)\nx = speeds * np.cos(radians)\ny = speeds * np.sin(radians)\n\n# Create chart\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\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    stroke_width=3,\n)\n\nchart = pygal.XY(\n    style=custom_style,\n    width=4800,\n    height=2700,\n    title=\"polar-scatter · pygal · anyplot.ai\",\n    x_title=\"X Component (m/s)\",\n    y_title=\"Y Component (m/s)\",\n    show_legend=True,\n    dots_size=8,\n    show_y_guides=True,\n    show_x_guides=True,\n    range=(-20, 20),\n    stroke=False,\n)\n\n# Add data by category (reordered so first series is green #009E73)\ncategories_order = [\"morning\", \"afternoon\", \"evening\"]\nfor cat in categories_order:\n    mask = np.array(categories) == cat\n    cat_x = x[mask]\n    cat_y = y[mask]\n    data = [(float(cx), float(cy)) for cx, cy in zip(cat_x, cat_y, strict=False)]\n    chart.add(cat.title(), data)\n\n# Save\nchart.render_to_png(f\"plot-{THEME}.png\")\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(chart.render())\n"}