{"spec_id":"choropleth-basic","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nchoropleth-basic: Choropleth Map with Regional Coloring\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 83/100 | Updated: 2026-05-15\n\"\"\"\n\nimport os\n\nimport numpy as np\nfrom pygal.style import Style\nfrom pygal_maps_world.maps import World\n\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\n\n# Theme tokens\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Viridis-inspired sequential colors (light to dark purples/blues)\n# These work well on both light and dark backgrounds\nVIRIDIS_COLORS = [\n    \"#440154\",  # dark purple\n    \"#31688e\",  # blue\n    \"#35b779\",  # green\n    \"#fde724\",  # yellow\n]\n\n# Data: GDP per capita (synthetic but realistic ranges)\nnp.random.seed(42)\n\n# Select a diverse set of countries from different regions\ncountry_codes = [\n    # Americas\n    \"us\",\n    \"ca\",\n    \"mx\",\n    \"br\",\n    \"ar\",\n    \"cl\",\n    \"co\",\n    \"pe\",\n    # Europe\n    \"de\",\n    \"fr\",\n    \"gb\",\n    \"it\",\n    \"es\",\n    \"nl\",\n    \"se\",\n    \"no\",\n    \"pl\",\n    \"pt\",\n    # Asia\n    \"cn\",\n    \"jp\",\n    \"in\",\n    \"kr\",\n    \"id\",\n    \"th\",\n    \"vn\",\n    \"my\",\n    # Africa\n    \"za\",\n    \"eg\",\n    \"ng\",\n    \"ke\",\n    \"ma\",\n    \"gh\",\n    # Oceania\n    \"au\",\n    \"nz\",\n]\n\n# Generate realistic GDP per capita values (in thousands USD)\nhigh_income = [\"us\", \"ca\", \"de\", \"fr\", \"gb\", \"nl\", \"se\", \"no\", \"jp\", \"kr\", \"au\", \"nz\"]\nupper_middle = [\"mx\", \"br\", \"ar\", \"cl\", \"cn\", \"my\", \"za\", \"pl\", \"pt\", \"it\", \"es\"]\n\ngdp_data = {}\nfor code in country_codes:\n    if code in high_income:\n        gdp_data[code] = np.random.uniform(40, 85)\n    elif code in upper_middle:\n        gdp_data[code] = np.random.uniform(10, 40)\n    else:\n        gdp_data[code] = np.random.uniform(1, 15)\n\n# Bin data into ranges for legend clarity\nbins = [\n    (\"GDP < $10k\", {k: v for k, v in gdp_data.items() if v < 10}),\n    (\"GDP $10k-$25k\", {k: v for k, v in gdp_data.items() if 10 <= v < 25}),\n    (\"GDP $25k-$50k\", {k: v for k, v in gdp_data.items() if 25 <= v < 50}),\n    (\"GDP > $50k\", {k: v for k, v in gdp_data.items() if v >= 50}),\n]\n\n# Map bins to colors from viridis palette\nbin_colors = VIRIDIS_COLORS[: len(bins)]\n\n# Custom style for large canvas with theme-adaptive colors\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=tuple(bin_colors),\n    title_font_size=28,\n    label_font_size=22,\n    legend_font_size=16,\n    major_label_font_size=18,\n    value_font_size=14,\n    tooltip_font_size=14,\n    no_data_font_size=14,\n)\n\n# Create world map\nworldmap = World(\n    style=custom_style,\n    width=4800,\n    height=2700,\n    title=\"choropleth-basic · pygal · anyplot.ai\",\n    show_legend=True,\n    legend_at_bottom=True,\n    legend_at_bottom_columns=4,\n    legend_box_size=40,\n    no_data=\"#888888\" if THEME == \"light\" else \"#666666\",\n)\n\n# Add each bin as a separate series\nfor label, data in bins:\n    worldmap.add(label, data)\n\n# Save outputs\nworldmap.render_to_file(f\"plot-{THEME}.html\")\nworldmap.render_to_png(f\"plot-{THEME}.png\")\n"}