{"spec_id":"bubble-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nbubble-basic: Basic Bubble Chart\nLibrary: letsplot 4.10.1 | Python 3.13.13\nQuality: 91/100 | Updated: 2026-05-28\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_point,\n    geom_smooth,\n    ggplot,\n    ggsave,\n    ggsize,\n    guide_legend,\n    guides,\n    labs,\n    layer_tooltips,\n    scale_color_manual,\n    scale_size_area,\n    scale_x_continuous,\n    theme,\n    theme_minimal,\n)\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\"\nRULE = \"rgba(26,26,23,0.15)\" if THEME == \"light\" else \"rgba(240,239,232,0.15)\"\n\nANYPLOT_PALETTE = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\n# Data - market analysis: companies by revenue, growth rate, and market share\nnp.random.seed(42)\n\nsectors = [\"Technology\", \"Healthcare\", \"Finance\", \"Energy\", \"Consumer Goods\"]\nrev_ranges = [(15, 120), (20, 140), (50, 200), (60, 195), (10, 130)]\ngrowth_params = [(28, -0.10), (18, -0.04), (10, -0.02), (7, -0.01), (15, -0.05)]\nshare_means = [10, 14, 20, 22, 12]\ncounts = [10, 10, 9, 8, 8]\n\nrows = []\nfor sector, (rev_lo, rev_hi), (g_base, g_slope), s_mean, n in zip(\n    sectors, rev_ranges, growth_params, share_means, counts, strict=True\n):\n    rev = np.random.uniform(rev_lo, rev_hi, n)\n    growth = g_base + g_slope * rev + np.random.randn(n) * 2.5\n    share = np.clip(np.random.randn(n) * 5 + s_mean, 2, 30)\n    for r, g, s in zip(rev, growth, share, strict=True):\n        rows.append({\"revenue\": r, \"growth_rate\": g, \"market_share\": s, \"sector\": sector})\n\ndf = pd.DataFrame(rows)\n\n# Plot\nplot = (\n    ggplot(df, aes(x=\"revenue\", y=\"growth_rate\", size=\"market_share\", color=\"sector\"))\n    + geom_point(\n        alpha=0.7,\n        tooltips=layer_tooltips()\n        .format(\"revenue\", \"${.1f}M\")\n        .format(\"growth_rate\", \"{.1f}%\")\n        .format(\"market_share\", \"{.1f}%\")\n        .line(\"@sector\")\n        .line(\"Revenue|@revenue\")\n        .line(\"Growth|@growth_rate\")\n        .line(\"Market Share|@market_share\"),\n    )\n    + geom_smooth(\n        aes(x=\"revenue\", y=\"growth_rate\"),\n        method=\"loess\",\n        color=INK_SOFT,\n        size=1.5,\n        alpha=0.12,\n        inherit_aes=False,\n        show_legend=False,\n    )\n    + scale_size_area(max_size=22, name=\"Market Share (%)\", breaks=[5, 10, 15, 20, 25])\n    + scale_color_manual(values=ANYPLOT_PALETTE, name=\"Sector\")\n    + scale_x_continuous(expand=[0.02, 10])\n    + guides(\n        color=guide_legend(nrow=1, override_aes={\"size\": 7}),\n        size=guide_legend(nrow=1, override_aes={\"color\": ANYPLOT_PALETTE[0], \"alpha\": 0.7}),\n    )\n    + labs(x=\"Revenue (Million USD)\", y=\"Growth Rate (%)\", title=\"bubble-basic · python · letsplot · anyplot.ai\")\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        axis_title=element_text(size=12, color=INK),\n        axis_text=element_text(size=10, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT),\n        plot_title=element_text(size=16, color=INK),\n        plot_margin=[30, 20, 20, 20],\n        legend_title=element_text(size=10, color=INK),\n        legend_text=element_text(size=10, color=INK_SOFT),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT, size=0.5),\n        panel_grid_major=element_line(size=0.3, color=RULE),\n        panel_grid_minor=element_blank(),\n        legend_position=\"bottom\",\n    )\n    + ggsize(800, 450)\n)\n\n# Save\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}