Introdução

O objetivo da aula de hoje é explorar diferentes técnicas de visualização de dados espaciais. Os tópicos a serem abordados são:

Definindo o diretório e carregando pacotes necessários

Recomendação: Crie uma pasta direto na unidade de disco do seu computador. Isso vai facilitar na definição do diretório, e evitar eventuais perdas de dados.

setwd("C:/Minicurso - Espacial")

Inicialmente vamos utilizar os mesmos pacotes da aula anterior.

Caso tenham dúvidas acerca dos pacotes e sua utilidade, basta pesquisar na aba “help”, ou, por exemplo, executem o código: ?tidyverse-package .

library(tidyverse)
library(ggmap)
library(sf)
library(readxl)
library(ggthemes)
library(ggpubr)

Importando e manipulando dados (atributos) - Base do CENSO demográfico

Vamos utilizar a base do Censo compilada pelo Atlas do Desenvolvimento Humano - IPEA-PNUD

Consultar no link http://www.atlasbrasil.org.br/acervo/biblioteca

Faremos a importação dos dados municipais manualmente devido a alguns erros que podem ocorrer ao importar especificamente o arquivo da base do IPEA-PNUD.

Vamos criar dois dataframes um para o Censo de 2000 e outro para o Censo de 2010. Para isso usamos a função filter() do pacote dplyr que está incluso no tidyverse.

Também podemos selecionar algumas variáveis de interesse para nosso exemplo.

Para fazer a separação usaremos a função select() também do pacote dplyr. Para isso basta adicionar outro operador pipe %>% e adicionar a função e o nome das variáveis selecionada separadas por vírgulas.

Consultar conteúdo extra 1

Censo_2000 <- read_excel("Censo_2000.xlsx")

Censo_2010 <- read_excel("Censo_2010.xlsx")

Importando geometria

Para importar as geometrias sem precisar procurar os arquivos online e fazer o download, vamos instalar e carregar o pacote geobr, desenvolvido pelo IPEA.

Para entender como o pacote funciona Consultar: https://cran.r-project.org/web/packages/geobr/vignettes/intro_to_geobr.html

#install.packages("geobr")

library(geobr)

A partir desse pacote é possível obter as geometrias de todos os recortes espaciais disponibilizados pelo IBGE.

Mun <- read_municipality(year = "2020", showProgress = F)

plot(st_geometry(Mun))

Agora resta unir geometria e atributos assim como fizemos na aula anterior, usando a função left_join(). Vamos criar dois objetos, um com os dados do Censo 2000 e outro com os dados de 2010.

Mun_2000 <- left_join(Mun, Censo_2000, by=c("code_muni"="Codmun7"))
  
Mun_2010 <- left_join(Mun, Censo_2010, by=c("code_muni"="Codmun7"))

Mapas coropléticos de variáveis contínuas

Os mapas, assim como os gráficos, são gerados com o ggplot2 camada por camada.

Para detalhes acerca da lógica de funcionamento do ggplot2 consultar: https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf

Mun_2010 %>% 
  ggplot()+ # Carrega a biblioteca gráfica
  geom_sf(aes(fill=PIND), colour = alpha("white", 0.3), linewidth = 0.1)+ #Adiciona geometria e estabelece a estética - aes()
  scale_fill_viridis_c(direction = -1, limits= c(0,100)) + # Cria uma escala de cores contínua
  theme_minimal()+ # Seleciona o tema estético
  labs(title = "Extrema Pobreza", subtitle = "Proporção - Censo - 2010", fill="(%)") #Adiciona legendas

# A função alpha() cria transparência - No exemplo acima estamos estabelecendo uma transparência de 50% para a cor branca

Para exportar o mapa em formato de imagem é necessário salvar o código que gerou o mapa em um objeto (ver aula 1) e depois usar a função ggsave do pacote ggpubr

Fazendo recortes

Usando a função filter podemos fazer recortes a partir dos dados agregados, da mesma forma que fazemos para um dataframe qualquer.

Mun_2010 %>% filter(name_region=="Nordeste") %>%
  ggplot()+ # Carrega a biblioteca gráfica
  geom_sf(aes(fill=PIND), colour = alpha("white", 0.3), linewidth = 0.1)+ #Adiciona geometria e estabelece a estética - aes()
  scale_fill_viridis_c(direction = -1) + # Cria uma escala de cores contínua
  theme_minimal()+ # Seleciona o tema estético
  labs(title = "Extrema Pobreza", subtitle = "Proporção - Censo - 2010", fill="(%)") #Adiciona legendas

Mun_2010 %>% filter(name_state=="Rio Grande do Norte") %>%
  ggplot()+ # Carrega a biblioteca gráfica
  geom_sf(aes(fill=PIND), colour = alpha("white", 0.3), linewidth = 0.1)+ #Adiciona geometria e estabelece a estética - aes()
  scale_fill_viridis_c(direction = -1) + # Cria uma escala de cores contínua
  theme_minimal()+ # Seleciona o tema estético
  labs(title = "Extrema Pobreza", subtitle = "Proporção - Censo - 2010", fill="(%)") #Adiciona legendas

Mapas coropléticos de variáveis quantitativas discretas ou qualitativas

Nesse exemplo vamos transformar uma variável contínua em uma variável discreta, criando categorias.

É importante ressaltar que existem diferentes formas de realizar as mesmas tarefas, ou de responder ao mesmo problema no R

É possível criar um “vetor”, que nada mais é que um objeto que armazena uma “linha de informações”, usando a seguinte estrutura de código:

vetor <- c(1, 2, 3, 4)

para variáveis qualitativas (texto em geral):

vetor <- c("Caetano", "Gilberto", "Gal", "Bethânia")

Para o nosso contexto vamos usar a função cut() para transformar a variável IDHM (Quantitativa - Contínua) em faixas de IDHM (Qualitativa - Ordinal)

IDHMc <- c(0, 0.499, 0.599, 0.699, 0.799, 1) #Pontos de corte

IDHMl <- c("Muito Baixo", "Baixo", "Médio", "Alto", "Muito Alto") #Nomes das categorias

# Perceba que estou selecionando apenas a variável de interesse dentro do objeto "Mun_2000" usando "$". Nesse caso a função "cut" substituirá os valores da variável.

Mun_2000$IDHM <- cut(Mun_2000$IDHM, breaks = IDHMc, labels = IDHMl)

Mun_2010$IDHM <- cut(Mun_2010$IDHM, breaks = IDHMc, labels = IDHMl)

Plotando mapa

A estrutura do código é praticamente a mesma. O único cuidado necessário é com a definição da paleta de cores.

Mun_2010 %>% 
  ggplot()+ # Carrega a biblioteca gráfica
  geom_sf(aes(fill=IDHM), colour = alpha("white", 0.3), linewidth = 0.1)+ 
  scale_fill_brewer(palette = "Spectral", guide = guide_legend(nrow = 1), na.value="grey")+ #Outra opção de paleta
  theme_minimal()+ # Seleciona o tema estético
  theme(legend.position = "bottom")+ # Trocando a posição da legenda do mapa
  labs(title = "Desenvolvimento Humano", subtitle = "Classes- Censo - 2010", fill="") 

Mapas coropléticos de intervalos iguais

A ideia do mapa de intervalos iguais é visualizar os dados com a partir da estrutura de um histograma.

Faremos isso para a variável desocupação. O princípio para criar esse tipo de mapa é o mesmo do mapa anterior.

Estabeleci que o tamanho dos intervalos é de 2.5% - Antes de estabelecer é sempre bom verificar a amplitude dos dados

Classes <- c(0, 2.5, 5, 7.5, 10, 12.5, 15, 40) #Pontos de corte 

Mun_2000$T_DES18M <- cut(Mun_2000$T_DES18M, breaks = Classes, right = F)

Mun_2010$T_DES18M <- cut(Mun_2010$T_DES18M, breaks = Classes, right = F)

Plotando mapa

A estrutura do código é praticamente a mesma. O único cuidado necessário é com a definição da paleta de cores.

 a <- Mun_2010 %>% 
  ggplot()+ 
  geom_sf(aes(fill=T_DES18M), colour = alpha("white", 0.3), linewidth = 0.1)+ 
  scale_fill_brewer(palette = "Spectral", guide = guide_legend(nrow = 1), na.value="grey", direction = -1)+ #inverti a ordem das cores
  theme_minimal()+ 
  theme(legend.position = "bottom")+ 
  labs(title = "Taxa de Desemprego", subtitle = "Classes- Censo - 2010", fill="") 
a

Vamos criar um histograma da variável para combinar com o mapa

 b <- Mun_2010 %>% 
  ggplot()+ 
  geom_histogram(aes(x=T_DES18M, fill=T_DES18M), stat="count")+ 
  scale_fill_brewer(palette = "Spectral", direction = -1)+ 
  theme_minimal()+ 
  theme(legend.position = "bottom")+ 
  labs(title = "Taxa de Desemprego", subtitle = "Classes- Censo - 2010", y="Número de Municípios", x= "Taxa de Desemprego", fill="") 

ggarrange(a, b, common.legend = T, legend = "bottom")

Mapas quantílicos

Um mapa quantílico divide determinada variável em grupos iguais. O mapa quantílico mais comum é o mapa de quartis, em que a variável é dividida em 4 partes.

É especialmente útil quando os dados possuem uma dispersão muito grande, ou muito pequena.

Vamos calcular os quantis usando a função quantile() que é do pacote base do R. Para esse mapa usaremos a variável GINI para os dados de 2010

# A função quantile por padrão já calcula os quartis

q <- quantile(Mun_2010$GINI, na.rm = T) #o argumento na.rm indica para a função desconsiderar informações faltosas

q
##   0%  25%  50%  75% 100% 
## 0.28 0.45 0.49 0.54 0.80
# Se quisermos quantis com intervalos diferentes basta especificar no argumento "probs" na forma de um vetor. Ver: ?quantile

Atenção: Mapas quantílicos com muitas categorias perdem o sentido

q1 <- quantile(Mun_2010$GINI, probs=seq(0, 1,by=0.01), na.rm = T) 

#A função seq me fornece uma sequencia de números entre intervalos determinados

q1_d <- as.data.frame(q1) # transformando objeto em dataframe

#  Gráfico de Frequência acumulada

a <- ggplot(q1_d)+ 
  geom_line(aes(x=q1, y=seq(0, 1,by=0.01)))+
  labs(x= "Índice de GINI", y= "Frequência", 
       title = "Indíce de GINI dos Municípios",
       subtitle = "Distribuição de Frequência - Censo 2010") + 
  theme_minimal() +
geom_hline(yintercept= c(0.25, 0.75), colour="red", linetype="dashed") #Adicionando linhas horizontais

a

Criando classes

Ainda usando a função cut() vamos criar as classes dos quantis que fizemos como uma nova variável usando a função mutate (consultar aula 1)

Mun_2010 <- Mun_2010 %>% mutate(Gini_q = cut(Mun_2010$GINI, breaks = q))

Plotando Mapas

b <-  Mun_2010 %>% 
      ggplot()+ 
      geom_sf(aes(fill=Gini_q), colour = alpha("white", 0.3), linewidth = 0.1)+ 
      scale_fill_viridis_d(option = "plasma", direction = -1, na.value="grey")+ 
      theme_minimal()+ 
      theme(legend.position = "bottom")+ 
      labs(title = "Índice de GINI", subtitle = "Quartis- Censo - 2010", fill="") 

ggarrange(b,a)

**Interpretação**
  • Em amarelo, é possível ver os 25% menos desiguais.

  • Em laranja entre 25% e 50%.

  • Em roxo entre 50% e 75%.

  • Em azul os 25% mais desiguais.

Cartogramas - Bolhas

Para construir o cartograma vamos precisar transformar a geometria. Vamos criar um novo objeto substituindo a geometria pelas cordenadas dos pontos centrais de cada município (centroids). Para isso usamos a função st_centroid

Mun_2010_n <- Mun_2010 %>% st_centroid()
a <- Mun_2010_n %>% 
  ggplot()+ 
  geom_sf(aes(size=PIND, colour=PIND))+ #Declarar argumento size
  scale_color_viridis_c(direction = -1, limits= c(0,60)) + 
  theme_minimal()+ 
  labs(title = "Extrema Pobreza", subtitle = "Proporção - Censo - 2010") 

a

## Adicionando basemaps, anotações (texto), escalas, e orientações cardinais.

Vamos aproveitar o cartograma que produzimos anteriormente para adicionar uma camada de base e alguns outros elementos. Para isso vamos precisar do pacote “ggspatial”

#install.packages("ggspatial")

library(ggspatial)
a <- Mun_2010_n %>% filter(abbrev_state=="MA") %>%
  ggplot()+ annotation_map_tile(type = "osm",zoomin = 0)+
  geom_sf(aes(size=IDHM, colour=PIND))+ #Declarar argumento size
  scale_color_viridis_c(direction = -1, alpha=0.6) + 
  theme_minimal()+ 
  labs(title = "Extrema Pobreza e Desenvolvimento Humano", subtitle = "Maranhão - Censo - 2010") 

a

a + annotation_north_arrow(location = "tr", style = north_arrow_minimal())+ annotation_scale()