{"spec_id":"lollipop-grouped","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nlollipop-grouped: Grouped Lollipop Chart\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-17\n\"\"\"\n\nimport os\n\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_rect,\n    element_text,\n    geom_point,\n    geom_segment,\n    ggplot,\n    ggsize,\n    labs,\n    scale_color_manual,\n    scale_x_continuous,\n    scale_y_continuous,\n    theme,\n    theme_minimal,\n)\nfrom lets_plot.export import ggsave\n\n\nLetsPlot.setup_html()\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\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\"]\n\n# Data - Quarterly revenue by product line across regions\nregions = [\"North\", \"South\", \"East\", \"West\"]\nproducts = [\"Electronics\", \"Furniture\", \"Clothing\"]\n\ndata_rows = []\nrevenue_data = {\"North\": [245, 180, 125], \"South\": [198, 165, 142], \"East\": [267, 195, 118], \"West\": [223, 172, 156]}\n\nfor i, region in enumerate(regions):\n    for j, product in enumerate(products):\n        data_rows.append(\n            {\n                \"region\": region,\n                \"product\": product,\n                \"revenue\": revenue_data[region][j],\n                \"x_pos\": i + (j - 1) * 0.25,\n                \"y_start\": 0,\n            }\n        )\n\ndf = pd.DataFrame(data_rows)\n\n# Plot\nplot = (\n    ggplot(df)\n    + geom_segment(mapping=aes(x=\"x_pos\", xend=\"x_pos\", y=\"y_start\", yend=\"revenue\", color=\"product\"), size=2)\n    + geom_point(mapping=aes(x=\"x_pos\", y=\"revenue\", color=\"product\"), size=8)\n    + scale_color_manual(values=IMPRINT, name=\"Product Line\")\n    + labs(x=\"Region\", y=\"Revenue ($ thousands)\", title=\"lollipop-grouped · Python · letsplot · anyplot.ai\")\n    + scale_x_continuous(breaks=list(range(len(regions))), labels=regions)\n    + scale_y_continuous(limits=[0, 300])\n    + ggsize(1600, 900)\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major_x=element_blank(),\n        panel_grid_major_y=element_blank(),\n        panel_grid_minor=element_blank(),\n        axis_text_x=element_text(size=16, color=INK_SOFT),\n        axis_text_y=element_text(size=16, color=INK_SOFT),\n        axis_title=element_text(size=20, color=INK),\n        plot_title=element_text(size=24, color=INK),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_title=element_text(size=18, color=INK),\n        legend_text=element_text(size=16, color=INK_SOFT),\n    )\n)\n\n# Save\nggsave(plot, filename=f\"plot-{THEME}.png\", path=\".\", scale=3)\nggsave(plot, filename=f\"plot-{THEME}.html\", path=\".\")\n"}