GET00183 - Visualização de Dados
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
recifeSimple 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
recifeSimple 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
graf1Podemos 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.
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.