{"spec_id":"lollipop-basic","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nlollipop-basic: Basic Lollipop Chart\nLibrary: pygal 3.1.3 | Python 3.13.14\nQuality: 90/100 | Updated: 2026-07-01\n\"\"\"\n\nimport os\nimport sys\nfrom pathlib import Path\n\n\n# Remove script directory from path to avoid name collision with pygal package\n_script_dir = str(Path(__file__).parent)\nsys.path = [p for p in sys.path if p != _script_dir]\n\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_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\nBRAND = \"#009E73\"  # Imprint palette position 1\n\n# Data — product sales by consumer electronics category (sorted descending)\ncategories = [\"Smartphones\", \"Laptops\", \"Tablets\", \"Headphones\", \"Smartwatches\", \"Cameras\", \"Speakers\", \"Gaming\"]\nvalues = [892, 654, 478, 312, 287, 198, 156, 134]\n\nsorted_data = sorted(zip(categories, values, strict=True), key=lambda x: x[1], reverse=True)\ncategories = [item[0] for item in sorted_data]\nvalues = [item[1] for item in sorted_data]\n\nn = len(categories)\n\n# Colors — top-ranked item in brand green, rest in Imprint muted anchor for visual hierarchy\ncolors = (BRAND,) + (INK_MUTED,) * (n - 1)\n\n# Style — theme-adaptive chrome, Imprint palette hierarchy\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=colors,\n    title_font_size=66,\n    label_font_size=56,\n    major_label_font_size=44,\n    legend_font_size=44,\n    value_font_size=36,\n    value_label_font_size=36,\n    stroke_width=6,\n    opacity=1,\n    opacity_hover=0.9,\n)\n\n# Plot — horizontal lollipop via XY: stem from x=0 to value, baseline node hidden\nchart = pygal.XY(\n    width=3200,\n    height=1800,\n    title=\"lollipop-basic · python · pygal · anyplot.ai\",\n    x_title=\"Sales (units)\",\n    y_title=\"Product Category\",\n    style=custom_style,\n    show_legend=False,\n    dots_size=20,\n    stroke=True,\n    show_x_guides=False,\n    show_y_guides=False,\n    margin=120,\n    xrange=(0, max(values) * 1.1),\n    range=(0.5, n + 0.5),\n    y_labels=[{\"label\": cat, \"value\": n - i} for i, cat in enumerate(categories)],\n)\n\nfor i, (cat, val) in enumerate(zip(categories, values, strict=True)):\n    y_pos = n - i\n    chart.add(cat, [{\"value\": (0, y_pos), \"node\": {\"r\": 0}}, {\"value\": (val, y_pos)}])\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"}