{"spec_id":"rose-basic","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nrose-basic: Basic Rose Chart\nLibrary: pygal 3.1.3 | Python 3.13.14\nQuality: 87/100 | Updated: 2026-07-25\n\"\"\"\n\nimport os\nimport sys\nfrom math import pi\n\n\n# Pop script directory so local pygal.py doesn't shadow the installed package\n_script_dir = sys.path.pop(0)\nfrom pygal.graph.radar import Radar\nfrom pygal.style import Style\n\n\nsys.path.insert(0, _script_dir)\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\nBRAND = \"#009E73\"  # Imprint palette position 1 — single series, always brand green\n\n# Data: Monthly rainfall (mm) — Pacific Northwest seasonal pattern\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nrainfall = [145, 115, 95, 65, 45, 35, 20, 25, 50, 90, 135, 155]\n\nARC_STEPS = 20  # points sampled along each wedge's outer arc for a smooth curve\n\n\nclass RoseChart(Radar):\n    \"\"\"Radar subclass that draws true pie-slice wedge sectors instead of a\n    connected star polygon: each category becomes its own closed shape\n    (center -> radial edge -> curved outer arc -> radial edge -> center),\n    which is the defining visual signature of a rose/coxcomb chart. Reuses\n    Radar's polar grid, angular month labels, and 12-o'clock start position\n    unchanged (those already render correctly).\"\"\"\n\n    def _plot(self):\n        delta = 2 * pi / self._len if self._len else 0\n        half = delta / 2\n        for serie in self.series:\n            serie_node = self.svg.serie(serie)\n            for i, value in enumerate(serie.values):\n                theta_center = self._x_pos[i]\n                theta_start = theta_center - half\n                theta_end = theta_center + half\n                wedge = [self.view((0, theta_start))] + [\n                    self.view((value, theta_start + (theta_end - theta_start) * k / ARC_STEPS))\n                    for k in range(ARC_STEPS + 1)\n                ]\n                self.svg.line(serie_node[\"plot\"], wedge, close=True, class_=\"line reactive\")\n                if serie.show_dots:\n                    x, y = self.view((value, theta_center))\n                    dots = self.svg.node(serie_node[\"overlay\"], class_=\"dots\")\n                    self.svg.node(dots, \"circle\", cx=x, cy=y, r=serie.dots_size, class_=\"dot reactive tooltip-trigger\")\n\n\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=(BRAND,),\n    title_font_size=66,\n    label_font_size=56,\n    major_label_font_size=44,\n    stroke_width=3,\n    opacity=0.7,\n    opacity_hover=0.88,\n)\n\nchart = RoseChart(\n    width=2400,\n    height=2400,\n    style=custom_style,\n    title=\"rose-basic · python · pygal · anyplot.ai\",\n    fill=True,\n    stroke=True,\n    show_dots=True,\n    dots_size=10,\n    show_legend=False,\n    show_x_guides=True,\n    show_y_guides=True,\n    range=(0, 160),\n    margin=70,\n    value_formatter=lambda v: f\"{v:.0f} mm\",\n)\n\nchart.x_labels = months\nchart.add(\"Monthly Rainfall\", rainfall)\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"}