Mapas de Calor

Explicando o que são mapas de calor e como construí-los no R
gráficos
Autor

Maria Cecília Macedo

Data de Publicação

28/06/2024

Hoje irei apresentar um recurso gráfico que acho muito interessante na visualização de dados, o Mapa de Calor. Também mostrarei como criá-los usando o software R.

O que é um mapa de calor?

Os Mapas de calor são representações gráficas que utilizam uma escala de cores para representar diferentes valores. Exemplificando, se tenho um conjuto de dados sobre a alimentação nos países europeus da década de 70 e quero construir um mapa de calor com ele, onde a escala de cores se intensifica conforme a média do consumo de determinado alimento aumenta, obtenho o seguinte mapa:

Mapas de calor podem sem também usados em um sentido mais literal do seu nome, onde queremos observar a incidência de algo, em uma determinada região (temperatura média de um estado brasileiro, por exemplo).

Criando mapas de calor com auxilo do RStudio

Existem várias maneiras de criar mapas de calor no R. Irei aprestentar duas delas: utilizando a função nativa heatmap() e, em seguida, a biblioteca ggplot2.

Trabalharei com um conjunto de dados similar ao que usei para o mapa de calor do consumo de alimentos dos países europeus mostrado anteriormente, mas com dados simulados sobre a alimentação de 10 espécies diferentes de tubarões.

Utilizando a função heatmap()

O R nos fornece uma função nativa para criarmos mapas de calor. Uma coisa bem interessante é que, por default, a função realiza a clusterização do conjunto de dados tanto das variáveis presentes no eixo das abscissas (eixo x) quanto do eixo das ordenadas (eixo y), ou seja, ela agrupa os dados “mais parecidos” entre si.

A seguir, apresentarei como criar o mapa de calor usando a função heatmap() e alterando essa clusterização que ela realiza.

Inicialmente, importarei o dataset criado com os dados fictícios.

dados_tubaroes <- read.csv("tubaroes_heatmap.csv", header = TRUE)
dados_tubaroes
                especie salmao atum linguado bacalhau sardinha
1        tubarao_branco    200  180      150      220      100
2       tubarao_martelo    180  150      160      200      120
3         tubarao_tigre    200  170      180      210      150
4        tubarao_salmao    180  150      160      200      120
5    tubarao_groelandia    200  180      160      220      150
6  tubarao_galha_branca    180  150      160      200      120
7  tubarao_branco_frade    190  160      170      210      130
8          tubarao_azul    170  140      150      190      110
9  tubarao_cabeca_chata    200  170      180      220      140
10         tubarao_mako    220  190      200      240      160

Como a função heatmap() pede que o objeto que contenha os dados seja uma matriz, farei a seguir uma pequena manipulação do conjunto de dados, onde colocarei os nomes das espécies de tubarões como nome das linhas e excluirei a coluna dados_tubaroes$especie, que não será mais necessária.

rownames(dados_tubaroes) <- dados_tubaroes$especie
dados_tubaroes <- dados_tubaroes[,-1]
dados_tubaroes
                     salmao atum linguado bacalhau sardinha
tubarao_branco          200  180      150      220      100
tubarao_martelo         180  150      160      200      120
tubarao_tigre           200  170      180      210      150
tubarao_salmao          180  150      160      200      120
tubarao_groelandia      200  180      160      220      150
tubarao_galha_branca    180  150      160      200      120
tubarao_branco_frade    190  160      170      210      130
tubarao_azul            170  140      150      190      110
tubarao_cabeca_chata    200  170      180      220      140
tubarao_mako            220  190      200      240      160

Agora que os dados já estão do jeito que quero, posso finalmente usar a função heatmap(), lembrando que eles terão que estar em forma de matriz.

heatmap(as.matrix(dados_tubaroes))

Como tinha dito, a função fez a clusterização dos dados. Observe que ela também mostra o dendograma dessa clusterização. Para retirar a clusterização, usa-se o argumento Rowv = NA para a das linhas e Colv = NA para a das colunas, veja:

#mapa de calor sem o dendograma das linhas
heatmap(as.matrix(dados_tubaroes), Rowv = NA) 

#mapa de calor sem o dendograma das colunas
heatmap(as.matrix(dados_tubaroes), Colv = NA) 

#mapa de calor sem os dendogramas
heatmap(as.matrix(dados_tubaroes), Rowv = NA, Colv = NA) 

Utilizando a biblioteca ggplot2

A biblioteca ggplot2 dá diversas funções interessantes para visualização de dados. Com ela é possivel criar os mais variados tipos de gráficos de maneira muito elegante (e eles ficam lindos!).

Antes de qualquer coisa, irei fazer a importação da biblioteca.

library(ggplot2)

Para criar o mapa de calor com ela, preferi fazer uma pequena alteração na estrutura do data frame, pois antes eles estavam dispostos de uma maneira que se assemelha a uma matriz e para conseguir usá-los com o ggplot preciso que eles estejam em um formato do tipo tabela. Apesar dessa alteração, o conteúdo dos dados permanece o mesmo. Veja como ficaram as primeiras 10 linhas:

dados_tubaroes <- read.csv("tubaroes_ggplot.csv", header = TRUE)
dados_tubaroes[1:10,]
           especie peixe_consumido consumo_diario
1   tubarao_branco          salmao            200
2   tubarao_branco            atum            180
3   tubarao_branco        linguado            150
4   tubarao_branco        bacalhau            220
5   tubarao_branco        sardinha            100
6  tubarao_martelo          salmao            180
7  tubarao_martelo            atum            150
8  tubarao_martelo        linguado            160
9  tubarao_martelo        bacalhau            200
10 tubarao_martelo        sardinha            120

Agora posso criar o gráfico. No eixo x quero que fiquem as espécies de que os tubarões consomem, e no eixo y o nome das espécies de tubarões que aparecem no conjunto de dados que estou trabalhando. O gráfico será preenchido com a quantidade de consumo de cada peixe por espécie. E utilizarei a geometria geom_tile para dar forma ao mapa de calor.

ggplot(data = dados_tubaroes, mapping = aes(x = peixe_consumido, 
                                            y = especie, 
                                            fill = consumo_diario))+
  geom_tile()

O ggplot me permite fazer diversas alterações no gráfico, irei fazer algumas a seguir para mostrar um pouquinho das diversas possibilidades que ele dá. Fique à vontade para explorar o pacote e descobrir outras alterações possiveis.

ggplot(data = dados_tubaroes, mapping = aes(x = peixe_consumido, 
                                            y = especie, 
                                            fill = consumo_diario))+
  geom_tile()+
  scale_fill_gradient(low = "lightskyblue1", high = "dodgerblue4")+
  guides(fill = guide_colourbar(barwidth = 0.75, barheight = 10))+
  labs(title = "Alimentação diária de tubarões",
       subtitle = "(em gramas)",
       x = "Peixes",
       y = "Espécie de tubarão")+
  theme_minimal()+
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Olha como ficou bonitinho!

Espero que tenha gostado dos mapas de calor e ficado interessado em criar alguns. Agora é sua vez de colocar os conhecimentos em prática.