Como criar um mapa de calor usando o Python

Como criar um mapa de calor usando o Python

Nesse artigo vou te mostrar como fazer uma representação visual para a frequência de acontecimentos em determinado lugar mais conhecido como mapa de calor usando Python e a biblioteca folium. Esse mapa de calor é bastante utilizado quando precisamos nos basear apenas em uma lista de coordenadas geográficas demarcando a ocorrência de um evento.

OBS: Vale lembrar que existem mapas de calor aplicados à outras finalidades, por exemplo, em websites ou até mesmo tabelas. No nosso caso vamos nos focar em criar um mapa de calor geográfico.

O que é um mapa de calor?

O heatmap, ou mapa de calor (tradução livre), é uma representação gráfica que mostra em quais pontos possuem maior atividade. Esse tipo de mapa possui várias finalidades, por exemplo, esse mapa pode auxiliar pessoas que querem saber em um site, ou blog, houve maior atividade por parte do usuário. Para isso, é necessário analisar as interações com o mouse, considerando também cliques e rolagem da página. Os mapas de calor são utilizadas em diversas ocasiões, até mesmo no esporte, mostrando como um atleta se desloca em um campo de futebol.

Outra aplicação para esse tipo de mapa é verificar qual é a frequência de um acontecimento em uma posição geográfica. Imagine, por exemplo, que queremos mostrar a frequência de homicídios em determinado país de acordo com os lugares com que eles acontecem. Seria necessário informar as posições geográficas desses registros e depois você precisaria aplicar uma cor mais “quente” como o vermelho para lugares com maior incidência e cores mais frias para regiões com menor incidência.

Fica claro que esse tipo de mapa não possui uma finalidade clara, mas representa bem a frequência de acontecimentos e determinado local. Mas agora vem a questão: Como posso construir um mapa assim?

Como criar um mapa de calor usando python

Para nosso exemplo, vamos construir apenas um mapa que mostra a incidência de um evento em posições geográficas. Para isso, utilizaremos uma sequência de coordenadas geográficas como fonte de dados e um trecho muito simples de código em python.

O primeiro passo é definir um arquivo contendo coordenadas geograficas (CSV, XLSX). Em seguida vamos usar a biblioteca folium para gerar esses mapas.  

Antes de qualquer coisa, certifique-se que a ferramenta está instalada:  

$ pip install folium

or

$ conda install -c conda-forge folium

A seguir, vamos importar o folium para um script no python:

import os
import folium

print(folium.__version__)

Logo após importamos o dataset usando o Pandas.

import pandas as pd

df = pd.read_csv("sul.csv", delimiter=";")

Por fim, geramos o mapa de calor:

# importa o folium
from folium.plugins import HeatMap
# cria uma instância de um mapa
m = folium.Map([48., 5.], tiles='stamentoner', zoom_start=6)
# adiciona o dataframe contendo os dados para o mapa
HeatMap(df).add_to(m)
# salva os resultados dentro da pasta do seu projeto
m.save(os.path.join('results', 'Heatmap.html')) 
## "results" é uma pasta e "heatmap.html" é o arquivo que será gerado

Isso gerará um mapa de calor semelhante ao mostrado na imagem:

Mapa de calor usando python e a biblioteca folium
Créditos: Computer science master

O projeto contendo o código completo e também alguns datasets de coordenadas estão disponíveis no nosso github.

Podemos coletar coordenadas automaticamente usando Python?

Observando o projeto, percebi que seria bastante útil que o usuário pudesse definir apenas uma lista de endereços e o Python fizesse as conversões para coordenadas automaticamente. Sendo assim, criei um vídeo no YouTube mostrando passo a passo como desenvolvi essa solução.  

                       


## faz a leitura do CSV contendo os endereços
import pandas as pd
df = pd.read_csv("enderecos.csv", delimiter=",")

## chama a API GeoPy
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="HeatMapAuto")

## consulta cada endereço e converte em uma lista de coordenadas
geocodes = []
for i in range (0,len(df.index)):    
    #texto = df['rua'][i] + "," + df['cidade'][i] + "," + df['estado'][i] + "," + df['pais'][i]
    
    location = geolocator.geocode(df['ceps'])
    geocodes.append([location.latitude,location.longitude])

## transforma a lista em um dataframe
import numpy as np

a = np.matrix(geocodes)
dfa = pd.DataFrame(a)

### Cria o mapa de calor 

import os
import folium

print(folium.__version__)

from folium.plugins import HeatMap

m = folium.Map([48., 5.], tiles='stamentoner', zoom_start=6)

HeatMap(dfa).add_to(m)

m.save(os.path.join('results', 'Heatmap.html'))

OBS: Apesar dessa solução parecer ser “milagrosa” existem alguns problemas ao utilizá-la. Geralmente o serviço de conversão de endereços em coordenadas é muito sensível a erros. Ou seja, muitos endereços que você informa não são encontrados e isso prejudica a geração do mapa. Fique à vontade para contribuir e construir uma forma mais robusta de construir esses mapas 🙂

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e a forma com que ela pode transformar vidas!

Este post tem um comentário

  1. Unknown

    Bom.
    Queria saber como coloco um título para o mapa, bem como autoria e similares (ou seja, como escrevo algo).
    Obrigado.

Deixe um comentário

quinze − 3 =