{"spec_id":"choropleth-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nchoropleth-basic: Choropleth Map with Regional Coloring\nLibrary: letsplot 4.9.0 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-15\n\"\"\"\n\nimport os\n\nimport pandas as pd\nfrom lets_plot import *\nfrom lets_plot.export import ggsave as export_ggsave\nfrom lets_plot.geo_data import geocode_countries\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\"\nNA_COLOR = \"#D0CFC8\" if THEME == \"light\" else \"#5A5953\"\nBORDER_COLOR = \"#3A3934\" if THEME == \"light\" else \"#D8D7D0\"\n\n# Data: GDP per capita by European countries (in thousands USD)\ndata = {\n    \"country\": [\n        \"Germany\",\n        \"France\",\n        \"Italy\",\n        \"Spain\",\n        \"Poland\",\n        \"Netherlands\",\n        \"Belgium\",\n        \"Sweden\",\n        \"Austria\",\n        \"Switzerland\",\n        \"Norway\",\n        \"Denmark\",\n        \"Finland\",\n        \"Ireland\",\n        \"Portugal\",\n        \"Czech Republic\",\n        \"Greece\",\n        \"Hungary\",\n        \"Romania\",\n        \"Bulgaria\",\n        \"Slovakia\",\n        \"Croatia\",\n        \"Slovenia\",\n        \"Lithuania\",\n        \"Latvia\",\n        \"Estonia\",\n        \"Luxembourg\",\n    ],\n    \"gdp_per_capita\": [\n        48.7,\n        42.3,\n        34.5,\n        30.1,\n        17.8,\n        57.0,\n        51.2,\n        55.7,\n        53.3,\n        92.4,\n        89.2,\n        67.8,\n        53.2,\n        100.2,\n        24.5,\n        27.0,\n        20.2,\n        18.8,\n        15.1,\n        13.9,\n        21.3,\n        18.5,\n        28.4,\n        24.0,\n        21.8,\n        28.3,\n        126.4,\n    ],\n}\ndf = pd.DataFrame(data)\n\n# Get country boundaries\ncountries = geocode_countries(df[\"country\"].tolist()).get_boundaries()\ndf_geo = countries.merge(df, left_on=\"found name\", right_on=\"country\", how=\"left\")\n\n# Create choropleth map with European focus\nplot = (\n    ggplot()\n    + geom_map(\n        aes(fill=\"gdp_per_capita\"),\n        data=df,\n        map=df_geo,\n        map_join=[\"country\", \"found name\"],\n        color=BORDER_COLOR,\n        size=1.0,\n        alpha=1.0,\n    )\n    + scale_fill_viridis(name=\"GDP per Capita\\n(thousands USD)\", na_value=NA_COLOR)\n    + labs(title=\"choropleth-basic · letsplot · anyplot.ai\")\n    + coord_cartesian(xlim=[-12, 32], ylim=[35, 71])\n    + ggsize(1600, 900)\n    + theme_minimal()\n    + theme(\n        plot_title=element_text(size=24, color=INK),\n        legend_title=element_text(size=18, color=INK),\n        legend_text=element_text(size=18, color=INK_SOFT),\n        legend_position=[0.82, 0.25],\n        axis_title=element_blank(),\n        axis_text=element_blank(),\n        axis_ticks=element_blank(),\n        panel_grid=element_blank(),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n    )\n)\n\n# Save as PNG (scale 3x for 4800 × 2700 px)\nexport_ggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=3)\n\n# Save interactive HTML\nexport_ggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}