{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "1e27ee66", "metadata": {}, "outputs": [], "source": [ "# file: brazil_regions_heatmap.py\n", "\n", "import folium\n", "import json\n", "import pandas as pd\n", "import requests\n", "from branca.colormap import linear\n", "\n", "# Porcentagens por região personalizada\n", "region_data = {\n", " \"Norte\": 17.4,\n", " \"Nordeste - norte\": 15.0,\n", " \"Nordeste - sul\": 18.1,\n", " \"São paulo\": 23.0,\n", " \"Sudeste\": 20.5,\n", " \"Sul\": 23.3\n", "}\n", "\n", "# Mapeamento de estados para regiões personalizadas\n", "region_mapping = {\n", " # Norte\n", " \"AC\": \"Norte\", \"AP\": \"Norte\", \"AM\": \"Norte\", \"PA\": \"Norte\", \"RO\": \"Norte\", \"RR\": \"Norte\", \"TO\": \"Norte\",\n", "\n", " # Nordeste - norte\n", " \"MA\": \"Nordeste - norte\", \"PI\": \"Nordeste - norte\", \"CE\": \"Nordeste - norte\",\n", " \"RN\": \"Nordeste - norte\", \"PB\": \"Nordeste - norte\", \"PE\": \"Nordeste - norte\",\n", "\n", " # Nordeste - sul\n", " \"AL\": \"Nordeste - sul\", \"SE\": \"Nordeste - sul\", \"BA\": \"Nordeste - sul\",\n", "\n", " # Sudeste (sem SP)\n", " \"MG\": \"Sudeste\", \"RJ\": \"Sudeste\", \"ES\": \"Sudeste\",\n", "\n", " # São Paulo\n", " \"SP\": \"São paulo\",\n", "\n", " # Sul\n", " \"PR\": \"Sul\", \"SC\": \"Sul\", \"RS\": \"Sul\"\n", "}\n", "\n", "# Baixar GeoJSON dos estados brasileiros\n", "geojson_url = 'https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/brazil-states.geojson'\n", "geojson_data = requests.get(geojson_url).json()\n", "\n", "# Construir DataFrame de estado -> porcentagem\n", "state_data = []\n", "centroids = {}\n", "region_centroid = {}\n", "region_states = {}\n", "\n", "for feature in geojson_data['features']:\n", " state_abbr = feature['properties']['sigla']\n", " region = region_mapping.get(state_abbr)\n", " percent = region_data.get(region)\n", " coords = feature['geometry']['coordinates'][0]\n", "\n", " # calcular centro aproximado (média dos pontos)\n", " if feature['geometry']['type'] == 'Polygon':\n", " lon = sum([point[0] for point in coords]) / len(coords)\n", " lat = sum([point[1] for point in coords]) / len(coords)\n", " elif feature['geometry']['type'] == 'MultiPolygon':\n", " coords = feature['geometry']['coordinates'][0][0]\n", " lon = sum([point[0] for point in coords]) / len(coords)\n", " lat = sum([point[1] for point in coords]) / len(coords)\n", " else:\n", " lon, lat = 0, 0\n", "\n", " centroids[state_abbr] = (lat, lon)\n", " state_data.append({\"state\": state_abbr, \"region\": region, \"percent\": percent})\n", "\n", " if region not in region_centroid:\n", " region_centroid[region] = []\n", " region_centroid[region].append((lat, lon))\n", "\n", " if region not in region_states:\n", " region_states[region] = set()\n", " region_states[region].add(state_abbr)\n", "\n", "df = pd.DataFrame(state_data)\n", "\n", "# Criar colormap azul (claro até escuro)\n", "colormap = linear.Blues_09.scale(df[\"percent\"].min(), df[\"percent\"].max())\n", "colormap.caption = \"Porcentagem de Ruptura Bruta por região\"\n", "\n", "# Criar mapa centrado apenas no Brasil com fundo branco (usar \"white tile\")\n", "white_tile_url = \"https://tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png\"\n", "m = folium.Map(location=[-14.2350, -51.9253], zoom_start=4, tiles=white_tile_url, attr='Wikimedia')\n", "\n", "# Adicionar o choropleth com estados não preenchidos em cinza claro\n", "folium.Choropleth(\n", " geo_data=geojson_data,\n", " name=\"choropleth\",\n", " data=df,\n", " columns=[\"state\", \"percent\"],\n", " key_on=\"feature.properties.sigla\",\n", " fill_color=\"Blues\",\n", " fill_opacity=0.9,\n", " line_opacity=0.5,\n", " line_color=\"black\",\n", " nan_fill_color=\"#dddddd\",\n", " nan_fill_opacity=1,\n", " highlight=True,\n", " legend_name=\"Porcentagem de Ruptura Bruta por região\"\n", ").add_to(m)\n", "\n", "# Adicionar uma única label por região (fonte maior)\n", "for region, coords in region_centroid.items():\n", " if region and region in region_data:\n", " lat = sum([c[0] for c in coords]) / len(coords)\n", " lon = sum([c[1] for c in coords]) / len(coords)\n", " percent = region_data[region]\n", " folium.map.Marker(\n", " [lat, lon],\n", " icon=folium.DivIcon(html=f'
{percent:.1f}%
')\n", " ).add_to(m)\n", "\n", "# Adicionar colormap\n", "colormap.add_to(m)\n", "\n", "# Salvar o mapa\n", "m.save(\"heatmap_brasil2.html\")\n" ] }, { "cell_type": "code", "execution_count": null, "id": "7f918e8a", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 5 }