{"spec_id":"lollipop-grouped","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\nlollipop-grouped: Grouped Lollipop Chart\nLibrary: matplotlib 3.10.9 | Python 3.13.13\nQuality: 82/100 | Updated: 2026-05-17\n\"\"\"\n\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n\n# Data: Quarterly revenue by product line across regions\nnp.random.seed(42)\n\ncategories = [\"North\", \"South\", \"East\", \"West\"]\nseries = [\"Electronics\", \"Furniture\", \"Clothing\"]\nn_categories = len(categories)\nn_series = len(series)\n\n# Revenue data in millions\nvalues = {\"Electronics\": [4.2, 3.1, 5.5, 2.8], \"Furniture\": [2.8, 3.5, 2.2, 4.1], \"Clothing\": [3.5, 2.9, 3.8, 3.2]}\n\n# Colors: Python Blue, Python Yellow, plus one more\ncolors = [\"#306998\", \"#FFD43B\", \"#4CAF50\"]\n\n# Plot\nfig, ax = plt.subplots(figsize=(16, 9))\n\n# Positioning: group lollipops side by side\nbar_width = 0.2\nx = np.arange(n_categories)\n\nfor i, (series_name, color) in enumerate(zip(series, colors, strict=True)):\n    # Offset position for each series within group\n    x_pos = x + (i - (n_series - 1) / 2) * bar_width\n    y_vals = values[series_name]\n\n    # Draw stems (thin vertical lines from baseline to marker)\n    for xp, yv in zip(x_pos, y_vals, strict=True):\n        ax.plot([xp, xp], [0, yv], color=color, linewidth=2, zorder=1)\n\n    # Draw markers (circular dots)\n    ax.scatter(x_pos, y_vals, s=250, color=color, zorder=2, label=series_name, edgecolors=\"white\", linewidths=1.5)\n\n# Styling\nax.set_xlabel(\"Region\", fontsize=20)\nax.set_ylabel(\"Revenue ($ millions)\", fontsize=20)\nax.set_title(\"lollipop-grouped · matplotlib · pyplots.ai\", fontsize=24)\nax.set_xticks(x)\nax.set_xticklabels(categories)\nax.tick_params(axis=\"both\", labelsize=16)\nax.set_ylim(0, 6.5)\nax.legend(fontsize=16, loc=\"upper right\")\nax.grid(True, alpha=0.3, linestyle=\"--\", axis=\"y\")\n\n# Add baseline\nax.axhline(y=0, color=\"black\", linewidth=0.8)\n\nplt.tight_layout()\nplt.savefig(\"plot.png\", dpi=300, bbox_inches=\"tight\")\n"}