O objetivo da aula de hoje é explorar diferentes técnicas de visualização de dados espaciais. Os tópicos a serem abordados são:
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)
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")
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"))
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
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
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)
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="")
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)
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")
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
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))
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.
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()