alt text

GET00183 - Visualização de Dados

Jony Arrais Pinto Junior

Um recurso muito útil para a visualização de dados é a produção de gráficos iterativos. A seguir são apresentados exemplos simples de alguns pacotes poderosos para este trabalho. Vamos inciar com a criação de mapas interativos.

1 - tmap

Vamo iniciar criando um mapa coroplético interativo usando o pacote tmap.

Atividade: Importe o arquivo Vendas_agregada_bairro.csv e guarde em um objeto chamado base_venda.

A base fornece o registro do número de produtos vendidos (por semestre e no ano todo) por bairro de um determinado produto, entre outras.

#Visualinado a base de dados
base_venda
# A tibble: 94 × 6
   no_bairro_residencia num.vendas.1sem num.vendas.2sem num.vendas gasto
   <chr>                          <dbl>           <dbl>      <dbl> <dbl>
 1 PAU FERRO                          1               0          1  4460
 2 SANTO ANTONIO                      6               2          8  4590
 3 PAISSANDU                         11               4         15  4369
 4 ILHA DO LEITE                     18               1         19  4614
 5 SOLEDADE                           1              20         21  4788
 6 JAQUEIRA                          20               4         24  4652
 7 TORREAO                            3              27         30  4794
 8 CABANGA                            6              25         31  4647
 9 SANTANA                           12              21         33  4852
10 DERBY                             20              14         34  4832
# … with 84 more rows, and 1 more variable: porc_panfletagem <dbl>

Atividade: Importe o shapefile recife.shp e guarde em um objeto chamado recife.

Reading layer `Bairros_Recife' from data source 
  `/Users/jonyarrais/Documents/Universidade Federal Fluminense/Disciplinas/GET00183 Visualizacao de Dados/Topico 13 - Gráficos interativos/Bairros_Recife.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 94 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 277547.5 ymin: 9098032 xmax: 295287.7 ymax: 9123296
Projected CRS: SIRGAS 2000 / UTM zone 25S
# visualizando o objeto
recife
Simple feature collection with 94 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 277547.5 ymin: 9098032 xmax: 295287.7 ymax: 9123296
Projected CRS: SIRGAS 2000 / UTM zone 25S
First 10 features:
  CBAIRRCODI VBAIRROID         EBAIRRNOME CRPAAACODI CMICROCODI TBAIRRULAT
1         19         0             RECIFE          1          1 1899-12-30
2         27         0      SANTO ANTONIO          1          2 1899-12-30
3         35         0           SAO JOSE          1          2 1899-12-30
4         43         0 ILHA JOANA BEZERRA          1          3 1899-12-30
5         51         0            CABANGA          1          2 1899-12-30
6         60         0            COELHOS          1          3 1899-12-30
  CEMPRECODI AUSUACMATR         EBAIRRNO_1 EBAIRRLINK
1          0          0             Recife       <NA>
2          0          0      Santo Antônio       <NA>
3          0          0           São José       <NA>
4          0          0 Ilha Joana Bezerra       <NA>
5          0          0            Cabanga       <NA>
6          0          0            Coelhos       <NA>
                        geometry
1 MULTIPOLYGON (((294617.4 91...
2 MULTIPOLYGON (((293353.3 91...
3 MULTIPOLYGON (((292458 9107...
4 MULTIPOLYGON (((290464.9 91...
5 MULTIPOLYGON (((291566 9106...
6 MULTIPOLYGON (((291634.3 91...
 [ reached 'max' / getOption("max.print") -- omitted 4 rows ]

Para criarmos um mapa coroplético interativo precisamos inicialmente acrescentar a variável de interesse ao shape, por meio de um merge do shape com a base.

Atividade: Incorpore as variáveis que se encontram na base de dados no shape. Use o nome dos municípios como chave na junção dos objetos.

#Visualinado o objeto
recife
Simple feature collection with 94 features and 15 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 277547.5 ymin: 9098032 xmax: 295287.7 ymax: 9123296
Projected CRS: SIRGAS 2000 / UTM zone 25S
First 10 features:
  CBAIRRCODI VBAIRROID         EBAIRRNOME CRPAAACODI CMICROCODI TBAIRRULAT
1         19         0             RECIFE          1          1 1899-12-30
2         27         0      SANTO ANTONIO          1          2 1899-12-30
3         35         0           SAO JOSE          1          2 1899-12-30
4         43         0 ILHA JOANA BEZERRA          1          3 1899-12-30
  CEMPRECODI AUSUACMATR         EBAIRRNO_1 EBAIRRLINK num.vendas.1sem
1          0          0             Recife       <NA>              39
2          0          0      Santo Antônio       <NA>               6
3          0          0           São José       <NA>             163
4          0          0 Ilha Joana Bezerra       <NA>             187
  num.vendas.2sem num.vendas gasto porc_panfletagem
1              42         81  4811        0.7075714
2               2          8  4590        0.1632857
3              58        221  4980        0.7220000
4             271        458  5082        0.7294286
                        geometry
1 MULTIPOLYGON (((294617.4 91...
2 MULTIPOLYGON (((293353.3 91...
3 MULTIPOLYGON (((292458 9107...
4 MULTIPOLYGON (((290464.9 91...
 [ reached 'max' / getOption("max.print") -- omitted 6 rows ]

A seguir, apresentamos o mapa coroplético do número de produtos vendidos no ano.

#Carregando pacote tmap
library(tmap)

#Transformando em uma geometria valida
recife = st_make_valid(x = recife)

## st_make_valid - transforma uma geometria invalida em uma valida
#Argumentos:
#x - um objeto da classe sf

# Criando um mapa estático
mapa = tm_shape(shp = recife) + 
  tm_fill(col = "num.vendas",
          breaks = quantile(recife$num.vendas, probs = seq(0,1,.1)),
          palette = "Greens",
          title = "Vendas") +
  tm_borders(lwd = 0.75,
             lty = "solid")

## tm_shape - cria um elemento tmap que especifica um objeto espacial
## tm_fill - cria um elemento tmap que desenha e preenche o mapa
#Argumentos:
#shp - um objeto da classe sf
#col - a variavel/atributo que deseja plotar
#palette - a paleta de cores
#title - Nome que deseja mostrar no titulo da legenda
## tm_borders - desenha as bordas que separam os poligonos
#Argumentos:
#lwd - espessura da borda
#lty - tipo de linha

#Visualizando o mapa
mapa

#Definindo o tipo do mapa como interativo
tmap_mode("view")

# Criando o mapa
tm_shape(shp = recife) + 
  tm_fill(col = "num.vendas",
          breaks = quantile(recife$num.vendas, probs = seq(0,1,.1)),
          palette = "Greens",
          title = "Vendas") +
  tm_borders(lwd = 0.75,
             lty = "solid")

Passe o mouse sobre o mapa um número é apresentado, você sabe dizer o que esse número significa? Experimente clicar sobre um bairro, o que é apresentado?

Quando clicamos, é apresentado uma caixa com o número de vendas e o número que é indicado quando passamos o mouse. Melhor do que esse código, o interessante seria aparecer o nome do bairro. Podemos melhorar a parte interativa?

#Melhorando o grafico
recife = recife %>% 
  mutate(nome_vendas = str_c(EBAIRRNOME, " - ", num.vendas))

tm_shape(recife) + 
  tm_fill(col = "num.vendas",
          breaks = quantile(recife$num.vendas, probs = seq(0,1,.25)),
          palette = "Greens",
          title = "Vendas",
          id = "nome_vendas")

Passando o mouse sobre os bairros, agora aparece o nome do bairro e a quantidade de produtos vendidos, respectivamente.

Um outro pacote muito poderoso para a criação de mapas interativos é o leaflet.

2 - plotly

O pacote plotly permite que criemos gráficos interativos plotly no R. Além disso, qualquer gráfico do ggplot2 pode ser transformado em um gráfico plotly.

Atividade: Importe o arquivo base_salario.txt e armazene-o em um objeto chamado base.

A base de dados possui duas variáveis:

  • salário em reais (salario);
  • número de anos completos de exeperiência na área que trabalha atualmente (experiencia).
# Visualizando o objeto
base
# A tibble: 100 × 2
   salario experiencia
     <dbl>       <dbl>
 1    948.           2
 2    965.           3
 3   1040.           3
 4   1047.           7
 5   1123.           7
 6   1127.           4
 7   1159.           0
 8   1141.           3
 9   1232.           3
10   1228.           1
# … with 90 more rows

A seguir apresentamos como construir um gráfico de dispersão para as variáveis salário e experiência.

# gráfico de dispersão
graf1 = ggplot(base, 
       aes(x = experiencia, 
           y = salario)) +
  geom_point(color="cornflowerblue", 
             size = 2, 
             alpha = .6)

# visualizando o objeto
graf1

Podemos perceber claramente que existe uma relação linear positiva entre as duas variáveis.

# carregando pacote
library(plotly)

# criando um gráfico plotly
ggplotly(graf1)

Ao passarmos o mouse sobre o gráfico são apresentados os valores das variáveis para cada ponto. Além disso, na barra do canto superior direito (apresentada na figura abaixo) podemos realizar diversas modificações, tais como: zoom, seleção de uma parte do gráfico, reaizar uma foto do gráfico, entre outras.

Figura 1: Barra que permite interação no gráfico.

Figura 1: Barra que permite interação no gráfico.

3 - rbokeh

rbokeh é uma interface para construção de gráficos animados do tipo Bokeh. Para instalar o pacote, use uma das duas possibilidades install.packages("rbokeh") ou remotes::install_github("bokeh/rbokeh").

A seguir apresentaremos como criar um gráfico de dispersão com o pacote rbokeh.

Atividade: Importe o arquivo Base_carros.txt e armazene-o em um objeto chamado base_carros.

Os dados foram extraídos da revista Motor Trend US 1974, trata-se da base mtcars do R. A base de dados possui 32 observações e 11 variáveis, dentre elas:

  • mpg - Milhas por galão;
  • cyl- número de cilindros;
  • disp - cilindrada do motor (em polegadas cúbicas - cu. in.);
  • wt - peso (em 1000 libras);
  • hp - potência do motor.
# Visualizando o objeto
base_carros
# A tibble: 32 × 12
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb nome       
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>      
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4 Mazda RX4  
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4 Mazda RX4 …
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1 Datsun 710 
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1 Hornet 4 D…
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2 Hornet Spo…
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1 Valiant    
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4 Duster 360 
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2 Merc 240D  
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2 Merc 230   
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4 Merc 280   
# … with 22 more rows
#carregando pacote
library(rbokeh)

# gráfico de dispersão
figure() %>%
  ly_points(disp, mpg, data = base_carros,
            color = cyl, glyph = cyl,
            hover = list(nome, mpg, wt))

O gráfico também possui uma barra (na lateral) que permite fazer interações com o gráfico.