(geobr Package) Analisando o estado da Paraíba

Parte 1: Instalando as dependencias

Limpando o console:

rm(list = ls())

Carreganto os pacotes necessários:

library(ggplot2)       # Plot
library(geobr)         # Plot data
library(ggspatial)     # Plot
library(showtext)      # Googlefonts
library(plotly)        # Plot
library(rvest)
library(stringi)       # Capitalize string

Setando o estilo da fonte:

# Carregando a fonte 'Sarabun' do Google fonts (https://fonts.google.com/) a atribuindo um nome à fonte (pode ser qualquer string)
font_add_google("Sarabun", "sara")
# Utiliza o showtext como redenrizador automático para os plots
showtext_auto()

Obtendo os dados:

all_muni <- read_municipality(   # Obtendo os dados das cidades da Paraíba
  code_muni = "PB", 
  year= 2010,
  showProgress = FALSE
)
## Using year 2010

Gráfico Simples:

graph_teste <- ggplot() +
  geom_sf(data=all_muni, fill="#c1d6f7", color="black", size=.15, show.legend = TRUE) +
  labs(x = "Longitude", y = "Latitude", title = "Municípios da Paraíba")+
  theme(
    axis.title.x = element_text(color="white", size=18, family='sara'),
    axis.title.y = element_text(color="white", size=18, family='sara'),
    axis.text.x = element_text(color="white", size=18, family='sara'),
    axis.text.y = element_text(color="white", size=18, family='sara'),
    panel.background = element_rect(fill="#292c63"),
    plot.title = element_text(hjust=0.5,family="sara", colour = 'white', size=25),
    plot.background = element_rect(fill = "#292c63")
  )
graph_teste

Parte 2: Lendo variáveis através de uma table (tag element de HTML) da página do Wikipédia:

Source: Tutorial Youtube

Para a Taxa de Homicídios

url <-  "https://pt.wikipedia.org/wiki/Lista_de_munic%C3%ADpios_da_Para%C3%ADba_por_taxa_de_homic%C3%ADdios "

html <- read_html(url)
print(html) # Print do código HTML da página
## {html_document}
## <html class="client-nojs" lang="pt" dir="ltr">
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
## [2] <body class="skin-vector skin-vector-search-vue vector-toc-not-collapsed  ...
Filtrando a tag element ’

’ do código HTML

alltables <- html %>% html_table(fill = TRUE)
print(alltables) # Filtrando todas tags <table> do código HTML (nesse cáso como a página só tinha uma tabela, apenas retornou ela
## [[1]]
## # A tibble: 220 × 3
##    Município      Taxa  `#`  
##    <chr>          <chr> <chr>
##  1 João Pessoa    56.6  01   
##  2 Santa Rita     41.8  02   
##  3 Bayeux         38.5  03   
##  4 Campina Grande 36.5  04   
##  5 Conde          35.6  05   
##  6 Brejo do Cruz  35.0  06   
##  7 Pedras de Fogo 31.9  07   
##  8 Pilar          30.6  08   
##  9 Bom Sucesso    27.0  09   
## 10 Alhandra       25.7  10   
## # … with 210 more rows
## 
## [[2]]
## # A tibble: 5 × 3
##   `vde Listas de municípios da Paraíba` `vde Listas de municí…` `vde Listas de…`
##   <chr>                                 <chr>                   <chr>           
## 1 Municípios                            Municípios              "Municípios"    
## 2 Geografia                             Altitude  •  Área (ter… ""              
## 3 População                             1872  •  1900  •  1920… ""              
## 4 Economia                              PIB  •  PIB per capita  ""              
## 5 Índices sociais                       Expectativa de vida  •… ""
                 # caso tivesse outras tabelas eu poderia acessa-las através do index, pois a variável 'alltables' funciona como uma lista)

Utilizando stringi::stri_trans_totitle nas strings dos nomes dos municípios para não haver conflito com a outra base ‘all_muni’

table1 <- alltables[[1]]
table1$Município <- stri_trans_totitle(table1$Município) # Capitalize
table1$Município
##   [1] "João Pessoa"                    "Santa Rita"                    
##   [3] "Bayeux"                         "Campina Grande"                
##   [5] "Conde"                          "Brejo Do Cruz"                 
##   [7] "Pedras De Fogo"                 "Pilar"                         
##   [9] "Bom Sucesso"                    "Alhandra"                      
##  [11] "Cabedelo"                       "Mulungu"                       
##  [13] "Boqueirão"                      "Mari"                          
##  [15] "Esperança"                      "Caaporã"                       
##  [17] "Duas Estradas"                  "São Mamede"                    
##  [19] "Araruna"                        "Soledade"                      
##  [21] "Juripiranga"                    "São Sebastião Do Umbuzeiro"    
##  [23] "São Vicente Do Seridó"          "Catolé Do Rocha"               
##  [25] "Patos"                          "São Bento"                     
##  [27] "Cuitegi"                        "Prata"                         
##  [29] "Guarabira"                      "Congo"                         
##  [31] "Itabaiana"                      "Barra De Santana"              
##  [33] "Jericó"                         "Arara"                         
##  [35] "Barra De São Miguel"            "Itaporanga"                    
##  [37] "Santa Cecília"                  "São Miguel De Taipu"           
##  [39] "Riachão Do Bacamarte"           "Umbuzeiro"                     
##  [41] "Alcantil"                       "Manaíra"                       
##  [43] "Aguiar"                         "Barra De Santa Rosa"           
##  [45] "Mamanguape"                     "Serra Redonda"                 
##  [47] "Aparecida"                      "Teixeira"                      
##  [49] "Serraria"                       "Bananeiras"                    
##  [51] "Mãe D'água"                     "São João Do Tigre"             
##  [53] "Natuba"                         "Pedro Régis"                   
##  [55] "Igaracy"                        "Monteiro"                      
##  [57] "Água Branca"                    "Pitimbu"                       
##  [59] "Pocinhos"                       "Puxinanã"                      
##  [61] "Brejo Dos Santos"               "Lagoa Seca"                    
##  [63] "Areial"                         "Taperoá"                       
##  [65] "Conceição"                      "Areia"                         
##  [67] "Sertãozinho"                    "Amparo"                        
##  [69] "Cacimbas"                       "Sumé"                          
##  [71] "São Sebastião De Lagoa De Roça" "Passagem"                      
##  [73] "Massaranduba"                   "Rio Tinto"                     
##  [75] "Dona Inês"                      "Lucena"                        
##  [77] "Paulista"                       "Itapororoca"                   
##  [79] "Juazeirinho"                    "Nazarezinho"                   
##  [81] "Carrapateira"                   "Casserengue"                   
##  [83] "São Domingos Do Cariri"         "São José Dos Ramos"            
##  [85] "Ingá"                           "Pilões"                        
##  [87] "Belém"                          "Mato Grosso"                   
##  [89] "Queimadas"                      "Pilõezinhos"                   
##  [91] "São José Do Bonfim"             "Sossêgo"                       
##  [93] "Alagoa Grande"                  "Ouro Velho"                    
##  [95] "Cuité"                          "Belém Do Brejo Do Cruz"        
##  [97] "Olivedos"                       "Poço De José De Moura"         
##  [99] "Sapé"                           "Coremas"                       
## [101] "Frei Martinho"                  "Santa Inês"                    
## [103] "Sobrado"                        "Vista Serrana"                 
## [105] "Cuité De Mamanguape"            "Fagundes"                      
## [107] "Diamante"                       "Pedra Lavrada"                 
## [109] "Pombal"                         "Nova Floresta"                 
## [111] "Olho D'água"                    "São José Da Lagoa Tapada"      
## [113] "Riacho Dos Cavalos"             "Juarez Távora"                 
## [115] "Salgado De São Félix"           "Araçagi"                       
## [117] "Boa Ventura"                    "São José Dos Cordeiros"        
## [119] "Matinhas"                       "Aroeiras"                      
## [121] "Cacimba De Areia"               "Caraúbas"                      
## [123] "Picuí"                          "Princesa Isabel"               
## [125] "Solânea"                        "Gurinhém"                      
## [127] "Lagoa"                          "Montadas"                      
## [129] "Piancó"                         "Poço Dantas"                   
## [131] "Sousa"                          "Catingueira"                   
## [133] "São José De Espinharas"         "Damião"                        
## [135] "Remígio"                        "Caturité"                      
## [137] "Cruz Do Espírito Santo"         "Riachão Do Poço"               
## [139] "Triunfo"                        "Cacimba De Dentro"             
## [141] "Santana De Mangueira"           "Matureia"                      
## [143] "Borborema"                      "São José De Piranhas"          
## [145] "Marizópolis"                    "Alagoa Nova"                   
## [147] "Boa Vista"                      "Santa Cruz"                    
## [149] "Cajazeiras"                     "Ibiara"                        
## [151] "Santa Helena"                   "Cubati"                        
## [153] "Nova Olinda"                    "Lagoa De Dentro"               
## [155] "Desterro"                       "Livramento"                    
## [157] "Caiçara"                        "Baía Da Traição"               
## [159] "Tavares"                        "Alagoinha"                     
## [161] "Uiraúna"                        "Gado Bravo"                    
## [163] "Jacaraú"                        "Tacima"                        
## [165] "Itatuba"                        "São João Do Rio Do Peixe"      
## [167] "Algodão De Jandaíra"            "Areia De Baraúnas"             
## [169] "Assunção"                       "Bernardino Batista"            
## [171] "Bonito De Santa Fé"             "Bom Jesus"                     
## [173] "Cabaceiras"                     "Cachoeira Dos Índios"          
## [175] "Cajazeirinhas"                  "Caldas Brandão"                
## [177] "Camalaú"                        "Capim"                         
## [179] "Condado"                        "Curral De Cima"                
## [181] "Curral Velho"                   "Emas"                          
## [183] "Gurjão"                         "Imaculada"                     
## [185] "Joca Claudino"                  "Junco Do Seridó"               
## [187] "Juru"                           "Lastro"                        
## [189] "Logradouro"                     "Malta"                         
## [191] "Manaíra"                        "Marcação"                      
## [193] "Mataraca"                       "Mogeiro"                       
## [195] "Nova Palmeira"                  "Pedra Branca"                  
## [197] "Pirpirituba"                    "Riachão"                       
## [199] "Salgadinho"                     "Santa Luzia"                   
## [201] "Santa Terezinha"                "Santana Dos Garrotes"          
## [203] "Santo André"                    "São Bentinho"                  
## [205] "São Domingos"                   "São Francisco"                 
## [207] "São João Do Cariri"             "São José De Caiana"            
## [209] "Serra Branca"                   "Serra Da Raiz"                 
## [211] "Serra Grande"                   "Tenório"                       
## [213] "Vieirópolis"                    "Coxixola"                      
## [215] "Parari"                         "Quixabá"                       
## [217] "Riacho De Santo Antônio"        "São José Do Brejo Do Cruz"     
## [219] "Várzea"                         "Zabelê"

Appending Taxa de homicídios da base de dados ‘table1’ na ‘all_muni’

i <- 1
while (i <= length(all_muni$name_muni)) {
    if (all_muni$name_muni[i] %in% table1$Município == TRUE){
    all_muni$Taxa[i] <- table1$Taxa[match(all_muni$name_muni[i], table1$Município)] 
    } else {
      all_muni$Taxa[i] <- NA
      }
  i = i+1
}

Para o Índice de Desenvolvimento Humano (IDH)

url <-  "https://pt.wikipedia.org/wiki/Lista_de_munic%C3%ADpios_da_Para%C3%ADba_por_IDH-M"

html <- read_html(url)
print(html)
## {html_document}
## <html class="client-nojs" lang="pt" dir="ltr">
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
## [2] <body class="skin-vector skin-vector-search-vue vector-toc-not-collapsed  ...
Filtrando a tag element ’

’ do código HTML

alltables <- html %>% html_table(fill = TRUE)
print(alltables)
## [[1]]
## # A tibble: 231 × 3
##    `Posição\nno Estado` Municípios       `Dados\nde 2010`
##    <chr>                <chr>            <chr>           
##  1 "Posição\nno Estado" Municípios       IDH municipal   
##  2 "IDH-M muito alto"   IDH-M muito alto IDH-M muito alto
##  3 "nenhum município"   nenhum município nenhum município
##  4 "IDH-M alto"         IDH-M alto       IDH-M alto      
##  5 "1"                  João Pessoa      0,763           
##  6 "2"                  Cabedelo         0,748           
##  7 "3"                  Campina Grande   0,720           
##  8 "4"                  Várzea           0,707           
##  9 "5"                  Patos            0,701           
## 10 "IDH-M médio"        IDH-M médio      IDH-M médio     
## # … with 221 more rows
## 
## [[2]]
## # A tibble: 3 × 6
##     IDH `Muito Alto`  Alto Médio Baixo `Muito Baixo`
##   <int>        <int> <int> <int> <int>         <int>
## 1  1991            0     0     0     1           222
## 2  2000            0     0     2     8           213
## 3  2010            0     5    66   152             0
## 
## [[3]]
## # A tibble: 10 × 14
##    `vdeClassificaçã…` `vdeClassifica…` ``    ``    ``    ``    ``    ``    ``   
##    <chr>              <chr>            <chr> <chr> <chr> <chr> <chr> <chr> <chr>
##  1 "Critérios geográ… "Altitude\nÁrea… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  2 "Critérios econôm… "Domicílios\nEm… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  3 "Critérios divers… "Denominação an… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  4 "Listas de municí… "Listas de muni… List… List… Regi… "Acr… Regi… "Ala… Regi…
##  5 "Listas de municí… "Listas de muni… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  6 "Região Norte"     "Acre\nAmapá\nA… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  7 "Região Nordeste"  "Alagoas\nBahia… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  8 "Região Centro-Oe… "Distrito Feder… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
##  9 "Região Sudeste"   "Espírito Santo… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
## 10 "Região Sul"       "Paraná\nRio Gr… <NA>  <NA>  <NA>   <NA> <NA>   <NA> <NA> 
## # … with 5 more variables: `` <chr>, `` <chr>, `` <chr>, `` <chr>, `` <chr>
## 
## [[4]]
## # A tibble: 6 × 2
##   X1                                                                      X2    
##   <chr>                                                                   <chr> 
## 1 Listas de municípios do Brasil por IDH por estado por região geográfica "List…
## 2 Região Norte                                                            "Acre…
## 3 Região Nordeste                                                         "Alag…
## 4 Região Centro-Oeste                                                     "Dist…
## 5 Região Sudeste                                                          "Espí…
## 6 Região Sul                                                              "Para…

*PS: Perceba que diferente da tabela de taxa de homicídio, na tabela do IDB as 4 primeiras linhas são apenas o título das variáveis, logo, temos que remove-las:

table_idh <- alltables[[1]]
table_idh <- table_idh[-c(1, 2, 3, 4), ]
table_idh$Municípios <- stri_trans_totitle(table_idh$Municípios) # Capitalize
print(table_idh)
## # A tibble: 227 × 3
##    `Posição\nno Estado` Municípios     `Dados\nde 2010`
##    <chr>                <chr>          <chr>           
##  1 1                    João Pessoa    0,763           
##  2 2                    Cabedelo       0,748           
##  3 3                    Campina Grande 0,720           
##  4 4                    Várzea         0,707           
##  5 5                    Patos          0,701           
##  6 IDH-M médio          Idh-M Médio    IDH-M médio     
##  7 6                    Santa Luzia    0,682           
##  8 7                    Cajazeiras     0,679           
##  9 8                    Guarabira      0,673           
## 10 9                    Sousa          0,668           
## # … with 217 more rows

Appending IDH da base de dados ‘table_idh’ na ‘all_muni’ e colocando NA nas cidades aonde não foram fornecidos o índice (há a possibilidade das cidades esterem com nomes diferentes nas bases de dados)

i <- 1
while (i <= length(all_muni$name_muni)) {
  if (all_muni$name_muni[i] %in% table_idh$Municípios == TRUE){
    all_muni$IDH[i] <- table_idh$'Dados\nde 2010'[match(all_muni$name_muni[i], table_idh$Municípios)] 
  } else {
    all_muni$IDH[i] <- NA
  }
  i = i+1
}

Perceba que as novas variáveis (IDH/Taxa) colocadas na base de dados são do tipo caracteres:

str(all_muni)
## Classes 'sf' and 'data.frame':   223 obs. of  7 variables:
##  $ code_muni   : num  2500106 2500205 2500304 2500403 2500502 ...
##  $ name_muni   : chr  "Água Branca" "Aguiar" "Alagoa Grande" "Alagoa Nova" ...
##  $ code_state  : chr  "25" "25" "25" "25" ...
##  $ abbrev_state: chr  "PB" "PB" "PB" "PB" ...
##  $ geom        :sfc_MULTIPOLYGON of length 223; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:57, 1:2] -37.7 -37.7 -37.7 -37.7 -37.7 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  $ Taxa        : chr  "11.8" "14.1" "7.1" "3.5" ...
##  $ IDH         : chr  "0,572" "0,597" "0,582" "0,576" ...
##  - attr(*, "sf_column")= chr "geom"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
##   ..- attr(*, "names")= chr [1:6] "code_muni" "name_muni" "code_state" "abbrev_state" ...

Para resolver esse problema, usei a seguinte solução:

all_muni$IDH <- as.numeric(gsub(",", ".", all_muni$IDH))
## Warning: NAs introduzidos por coerção
all_muni$Taxa <- as.double(all_muni$Taxa) # Para a variável taxa foi mais simples pq ela já apesentada como separador decimal o ponto '.' diferente do IDH
## Warning: NAs introduzidos por coerção
str(all_muni)
## Classes 'sf' and 'data.frame':   223 obs. of  7 variables:
##  $ code_muni   : num  2500106 2500205 2500304 2500403 2500502 ...
##  $ name_muni   : chr  "Água Branca" "Aguiar" "Alagoa Grande" "Alagoa Nova" ...
##  $ code_state  : chr  "25" "25" "25" "25" ...
##  $ abbrev_state: chr  "PB" "PB" "PB" "PB" ...
##  $ geom        :sfc_MULTIPOLYGON of length 223; first list element: List of 1
##   ..$ :List of 1
##   .. ..$ : num [1:57, 1:2] -37.7 -37.7 -37.7 -37.7 -37.7 ...
##   ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
##  $ Taxa        : num  11.8 14.1 7.1 3.5 2.6 14.4 0 25.7 1.9 9.5 ...
##  $ IDH         : num  0.572 0.597 0.582 0.576 0.595 0.578 0.548 0.582 0.608 0.606 ...
##  - attr(*, "sf_column")= chr "geom"
##  - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
##   ..- attr(*, "names")= chr [1:6] "code_muni" "name_muni" "code_state" "abbrev_state" ...

Foi necessário achar os valores mínimos e máximos do IDH para construir o gráfico de forma que o gradiente da cor fosse mais visível:

# Dando replace nos NA's para que eu possa ver o valor máximo e mínimo dos meus dados
all_muni$IDH[is.na(all_muni$IDH)] <- 0

min(all_muni$IDH)
## [1] 0
max(all_muni$IDH)
## [1] 0.763

Parte 3: Plotando o gráfico

Gráfico não interativo

graph_teste1 <- ggplot() +
  geom_sf(data=all_muni, aes(fill=IDH), color= 'black', size=.15) +
  labs(title = "IDH - Municípios da Paraíba") +
  scale_fill_distiller(palette = "Reds", direction = 1, name="IDH", na.value='red', guide = "coloursteps", limits = c(0.501,0.763)) +
  theme(
    plot.title = element_text(hjust=0.5,family="sara", colour = 'black', size=25)
  )
graph_teste1


Gráfico interativo (tentativa)

Utilizando plotly::ggplotly

PS: Perceba que o gráfico interativo não está funcionando do jeito que se esperava, pois ele está sendo interativo quando o hover do mouse está nas divisões das cidades, e no caso deveria ser quando o mouse estivesse em cima da região da cidade.

ggplotly(graph_teste1)

Fontes:

  • Resolver Problema de abrir links externos no Rpubs
  • Resolver Problema de abrir links externos no Rpubs 2
  • Rmarkdown Themes
  • geobr Docs
  • Create Rpubs account and publish






    © Copyright 2022 jgpds