Os heatmaps, ou mapas de calor em bom português, representam um meio de visualização de dados amplamente presente em diversas áreas do conhecimento. Esse tipo de gráfico permite ilustrar a distribuição e a intensidade de uma variável de forma visualmente interessante e razoavelmente simples de entender. Nesta nova edição da coluna Breve Introdução, vamos explorar um pouco de como produzir heatmaps para representar variáveis climáticas e, claro, sempre com Python.
Heatmaps são pop
Um dos campos em que os heatmaps possuem um papel de destaque é a própria Climatologia. Mesmo que você nunca tenha ouvido falar em heatmaps antes, é muito provável que você já tenha visto pelo menos um. O melhor exemplo contemporâneo é o das chamadas Warming Stripes, ou faixas de aquecimento em tradução livre, criadas pelo meteorologista inglês Ed Hawkins para representar o aumento da temperatura média da Terra ao longo do tempo e o aquecimento global.
As Warming Stripes ganharam destaque e se tornaram uma espécie de ícone popular pela sua capacidade de comunicar de forma clara as mudanças climáticas. Nesse design que você pode ver acima, cada ano desde 1850 é representado por uma faixa vertical colorida, onde as cores mais quentes indicam temperaturas acima da média histórica e as cores mais frias indicam temperaturas mais baixas. O formato é simples e minimalista, sem barras de cores ou até mesmo legendas nos eixos, mas sem deixar de comunicar a mensagem para a audiência de um jeito muito bem feito e pensado. Simples, direto e efetivo.
O meio e a mensagem
As Warming Stripes originais do Ed Hawkins foram produzidas a partir dos dados de anomalias anuais de temperatura média do planeta dos conjuntos HadCRUT4 e HadCRUT5, mantidos pelo UK Met Office. As anomalias de temperatura são monitoradas não apenas pelo UK Met Office, mas por um grande número de Institutos de Meteorologia e Climatologia pelo mundo, de modo que há bem mais de uma opção disponível para analisar e usar.
Um desses institutos é o estadunidense Berkeley Earth, fundado em 2010 por um grupo de climatologistas, dedicado a fornecer análises objetivas e transparentes sobre o clima global. Uma de suas principais missões é manter de forma independente um conjunto global de dados de temperatura, conhecido por Berkeley Earth Surface Temperatures (BEST). É possível encontrar vários conjuntos e séries temporais de anomalias de temperatura relacionadas no portal, incluindo uma série temporal global de anomalias de temperatura em resolução mensal.
E como essa série está bem armazenada no site e tem acesso aberto a qualquer pessoa, podemos facilmente processá-la e analisá-la com um pouco de Pandas e Python. Esse é o nosso próximo passo a partir de agora.
O começo de tudo: pré-processamento dos dados
Como você já viu em outras edições da coluna Breve Introdução no Blog, processar e descrever arquivos de dados tabelados é tarefa simples com Pandas. Sempre é importante olhar os dados no olho antes de partir para a leitura do arquivo, então veja aqui como a tabela está formatada, sem deixar de notar a sua descrição no cabeçalho marcado com % no início de cada linha.
Depois desse contato inicial, vamos precisar de quatro pacotes diferentes para a tarefa de criar um heatmap baseado nas Warming Stripes a partir da série de anomalia de temperatura média global. São eles: NumPy, Pandas, Seaborn e Matplotlib. Com tudo pronto, vamos usar pd.read_csv() para abrir a tabela no link e transformá-la em um DataFrame padrão. Sabemos que as linhas marcadas com % são comentários que devem ser descartados, bem como a separação por espaços entre cada uma das tabelas. Por isso, também declaramos os argumentos comment='%' e sep='\s+', além de header=None para indicar que não há uma linha de cabeçalho com os nomes das colunas determinados.
Como não vamos usar todos os dados de best, vale a pena criar um novo DataFrame e usá-lo para armazenar somente as colunas que vamos plotar depois. O novo DataFrame definido em best_temp foi construído usando um dicionário que contém duas chaves distintas, uma para o tempo em 'Date' e outra para as anomalias de temperatura em 'Temp'. Veja que 'Date' é associada a um objeto de tempo criado com pd.date_range(), que gera uma sequência mensal de datas entre Janeiro de 1850 a Março de 2023.
Logo em seguida, 'Temp' é associada aos valores de anomalias de temperatura extraídos de best, mas veja que best.iloc[:2079, 2].values seleciona as primeiras 2079 linhas da terceira coluna da tabela e extrai seus valores em forma de ndarray — uma sequência de elementos numéricos no formato próprio do NumPy. Você consegue imaginar o motivo para isso? Faça uma nova inspeção ao longo da tabela no link que redireciona ao portal do Berkeley Earth e descubra o que acontece após a linha 2079.
O último passo do pré-processamento é calcular as anomalias de temperatura anuais a partir dos dados originais mensais. Esse tipo de procedimento é feito facilmente com o famoso .groupby() em combinação com pd.Grouper(freq='1Y') para agrupar os dados por ano e calcular a média aritmética com .mean() ao final. O resultado é armazenado no novo DataFrame definido em best_temp_anual.
Enfim, heatmaps!
Com a série temporal anual processada e pronta para uso, resta agora chegar ao objetivo final de criar heatmaps dos dados no estilo das Warming Stripes. Há mais de uma abordagem possível para produzir esse tipo de gráfico em Python, mas a melhor — na humilde opinião desde que vos fala — é através da função .heatmap() do Seaborn. Esse é um dos principais pacotes de visualização gráfica de dados em Python e é baseado na estrutura do Matplotlib. O Seaborn tem uma sintaxe de alto nível que facilita a criação de vários tipos de gráficos estatísticos importantes, muito além dos heatmaps.
O uso de .heatmap() é tão simples que a dificuldade maior é acertar a estética final do gráfico, minimalista ao máximo (por mais contraditório que pode parecer), mas nada que seja complicado. Além disso, um detalhe que pode causar muitos erros é o fato de que os dados de entrada em .heatmap() não podem ser unidimensionais, como uma série temporal é, de modo que é necessário adicionar uma dimensão a mais aos dados. Quando o caso é de plotar uma matriz de dados disposta em anos x meses, por exemplo, não é necessário usar esse pequeno truque.
Por convenção da comunidade, o Seaborn é importado como sns. E como a estrutura do pacote está baseada no Matplotlib, vai ser importante usar o clássico módulo pyplot. Sendo assim, o código do gráfico deve começar com fig, ax = plt.subplots() para formar a figura e um conjunto de eixos que irão abrigar o gráfico. A função sns.heatmap() é usada para plotar o heatmap de best_temp_anual[np.newaxis,:], agora transformado de um simples vetor coluna para uma estrutura bidimensional similar a uma matriz.
A estética do heatmap é definida com o uso de diversos argumentos, como cmap='RdBu_r' para usar a paleta de cores que varia da escala de azul para vermelho, representando as anomalias de temperatura. O argumento cbar=False remove a barra de cores ao lado do gráfico e vmin=-1 e vmax=1 definem os valores mínimo e máximo plotados.
Além do mínimo e máximo, center=0. indica que a cor central que vai dividir os tons da escala de cores divergente será o valor 0. Por fim, xticklabels=False e yticklabels=False removem as informações em texto dos eixos x e y. O resultado final é o heatmap ao estilo original das Warming Stripes abaixo, feito a partir dos dados de anomalia de temperatura do planeta mantida pelo Berkeley Earth. Criado do zero com Python, Pandas e Seaborn.
Com um estilo simples e direto, ainda que um pouco implícito, as Warming Stripes são um ótimo exemplo de heatmap e mostram como esse tipo de gráfico pode ser uma forma poderosa de visualização de dados e comunicação científica. Agora o desafio está lançado para você fazer os seus próprios heatmaps com os dados que você tem! Aproveite e clique no botão abaixo para baixar o Jupyter Notebook de apoio do post.
Chegamos ao fim de mais uma edição da coluna Breve Introdução, exclusiva no Blog da Meteonorte. Além de acompanhar os novos posts por aqui, siga também a Meteonorte nas redes e compartilhe esse conteúdo climático com quem você conhece. Até a próxima!
PS: Agora você também pode ter acesso a todo o material disponível pela coluna Breve Introdução no Github da Meteonorte! Clique aqui e confira.
Comments