GET00183 - Visualização de Dados
Na grande maioria das vezes, os padrões de um gráfico são adequados para uma primeira inspeção dos dados. Para publicar resultados de uma pesquisa ou conseguir uma melhor comunicação com o seu público de interesse, provavelmente precisaremos personalizar os resultados. Essa personalização, usualmente, melhora a clareza e a atratividade de um gráfico.
A seguir, discutiremoscomo personalizar os eixos, linhas de grade, cores, fontes, rótulos e legendas de um gráfico. Também abordaremos como adicionar anotações nas visualizações.
1 - Eixo
Os eixos x e y representam valores numéricos, categóricos ou datas. É possível personalizar cada um destes tipos. Para as discussões feitas a seguir, vamos inicialmente importar uma base de dados.
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 x 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
1.1 - Eixos quantitativos
Os eixos x e y, quando quantitativos, são modificados pelas funções scale_x_continuous e scale_y_continuous. Estas funções dependem de diversos argumentos, dentre eles do breaks que é um vetor numérico com as posições dos números que serão apresentados e limits que também é um vetor numérico, indicando os valores mínimo e máximo do eixo.
A seguir, vamos criar um gráfico de dispersão especificando os limites e os valores que queremos que sejam apresentados em cada eixo.
# carregando pacote
library(ggplot2)
# criando um gráfico de dispersão com eixos modificados
base_carros |>
ggplot(mapping = aes(x = disp,
y = wt)) +
geom_point() +
scale_x_continuous(breaks = seq(50, 475, 25),
limits=c(50, 475)) +
scale_y_continuous(breaks = seq(1, 6, 1),
limits=c(1, 6))Suponha que o desejo seja criar o gráfico de dispersão usando no eixo x a porcentagem da cilindrada do carro em relação ao carro com a maior cilindrada, ou seja, no eixo x irá aparecer o valor de disp/max(disp) para cada carro e ao invés de aparecer no eixo y o peso (em 1000 libras) queremos que apareça o peso em uma outra escala, ou seja, wt \(\times\) 100.000. Para isso, vamos criar as duas variáveis para serem usadas somente na visualização e não guardá-las na base de dados.
# criando um gráfico de dispersão
base_carros |>
mutate(porc_disp = disp/max(disp),
wt_libras = wt*100000) |>
ggplot(mapping = aes(x = porc_disp,
y = wt_libras)) +
geom_point()O que acontece com os eixos do gráfico acima. No eixo y os números são muito grandes e aparecem em notação científica. Já o eixo x não dá uma indicação de que esteja sendo representado uma porcentagem. Como modificar isso?
# criando um gráfico de dispersão
base_carros |>
mutate(porc_disp = disp/max(disp),
wt_libras = wt*100000) |>
ggplot(mapping = aes(x = porc_disp,
y = wt_libras)) +
geom_point() +
scale_x_continuous(label = scales::percent) +
scale_y_continuous(label = scales::label_number(big.mark = ".",
decimal.mark = ","))O percent apresenta o rótulo do eixo em porcentagem e o label_number força o eixo ser apresentado em número e não em notação científica. Além disso, foi estipulado que o separador de milhares seria o “.” ponto e o decimal a “,” vírgula.
1.2 - Eixos qualitativos
Os eixos x e y, quando qualitativos, são modificados pelas funções scale_x_discrete e scale_y_discrete. Estas funções dependem de diversos argumentos, dentre eles do limits que é um vetor de character (as categorias da variável qualitativa na ordem que se deseja apresentar) e labels que também é um vetor de characteres com os rótulos que se deseja apresentar, este argumento é opcional.
A seguir, vamos criar um gráfico de barras da variável setor. Para isso, precisaremos importar uma nova base de dados.
Atividade: Importe o arquivo survey85.csv e armazene-o em um objeto chamado survey.
A base de dados possui variáveis referentes a uma pesquisa survey realizada em 1985 contendo remuneração e outras características de trabalhadores, tais como:
- salário por hora em dólares (remuneracao);
- número de anos de educação (educacao);
- sexo;
- é hispânico? (hispanico);
- é do sul? (sul);
- é casado? (casado);
- tempo de experiência de trabalho (exper);
- idade;
- setor de trabalho (setor).
# Visualizando o objeto
survey# A tibble: 533 x 10
remuneracao educacao raca sexo hispanico sul casado exper idade setor
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <chr>
1 9 10 Branco M N N S 27 43 constru…
2 5.5 12 Branco M N N S 20 38 vendas
3 3.8 12 Branco F N N N 4 22 vendas
4 10.5 12 Branco F N N S 29 47 adminis…
5 15 12 Branco M N N S 40 58 constru…
6 9 16 Branco F N N S 27 49 adminis…
7 9.57 12 Branco F N N S 5 23 servico
8 15 14 Branco M N N N 22 42 vendas
9 11 8 Branco M N N S 42 56 fabrica
10 5 12 Branco F N N S 14 32 vendas
# … with 523 more rows
A seguir, apresentamos o passo a passo para a construção de um gráfico de barras para a variável setor.
# gráfico de barras
# Criando um gráfico de barras para a variável setor
survey |>
ggplot(mapping = aes(x = setor)) +
geom_bar()Se quisermos modificar o rótulo do eixo x podemos fazer da seguinte forma.
# gráfico de barras
# Criando um gráfico de barras para a variável setor
survey |>
ggplot(mapping = aes(x = setor)) +
geom_bar(fill = "blue") +
scale_x_discrete(limits = c("administrativo", "fabrica", "construcao",
"gerente", "outro", "prof",
"servico","vendas"),
labels = c("Administrativo", "Fábrica",
"Contrução\nCivil", "Gerente", "Outro",
"Professores", "Serviço","Vendas"))Podemos perceber no gráfico que foi realizado uma troca na ordem das categorias fabrica e construcao. Além disso, todos os rótulos foram modificados. Vejam que não foi feita nenhuma modificação na base de dados, somente na visualização.
1.3 - Eixos com datas
Os eixos x e y, quando datas, são modificados pelas funções scale_x_date e scale_y_date. Estas funções dependem de diversos argumentos, dentre eles do date_breaks uma string que indica o distanciamento entre duas quebras no eixo, por exemplo, 3 semanas ou 20 dias e date_labels que também é uma string indicando o formato para os rótulos, como indicado abaixo.
Para discutirmos as modificações no eixo do tipo data vamos precisar importar uma base de dados.
Atividade: Importe o arquivo base_SELIC_IPCA.csv e armazene-o em um objeto chamado base_BR.
A base de dados possui variáveis referentes a dois índices econômicos brasileiros:
- data - data referente a mensuração do índice;
- índice nacional de preços ao consumidor amplo (ipca);
- taxa selic (selic).
# Visualizando o objeto
base_BR# A tibble: 498 x 3
data ipca selic
<chr> <dbl> <dbl>
1 01/01/1980 6.62 NA
2 01/02/1980 4.62 NA
3 01/03/1980 6.04 NA
4 01/04/1980 5.29 NA
5 01/05/1980 5.7 NA
6 01/06/1980 5.31 NA
7 01/07/1980 5.55 NA
8 01/08/1980 4.95 NA
9 01/09/1980 4.23 NA
10 01/10/1980 9.48 NA
# … with 488 more rows
# Carregando pacote
library(lubridate)
# Tratando a data
base_BR = base_BR |>
mutate(data = dmy(data))
# Visualizando o objeto
base_BR# A tibble: 498 x 3
data ipca selic
<date> <dbl> <dbl>
1 1980-01-01 6.62 NA
2 1980-02-01 4.62 NA
3 1980-03-01 6.04 NA
4 1980-04-01 5.29 NA
5 1980-05-01 5.7 NA
6 1980-06-01 5.31 NA
7 1980-07-01 5.55 NA
8 1980-08-01 4.95 NA
9 1980-09-01 4.23 NA
10 1980-10-01 9.48 NA
# … with 488 more rows
Após a importação e o tratamento da variável para a classe date, podemos fazer um gráfico de linhas do IPCA entre os anos de 2017 e 2019.
# Plotando duas séries no mesmo gráfico
graf_temp = base_BR |>
filter(data > dmy("31-12-2016"), data < dmy("01-01-2020")) |>
ggplot(aes(x = data,
y = ipca)) +
geom_line()
# Visualizando o gráfico
graf_tempAbaixo vamos fazer algumas mo
# criando diferentes periodicidades de aparição e composições para os rótulos das datas
graf_temp +
scale_x_date(date_breaks = "5 month",
date_labels = "%b-%y")graf_temp +
scale_x_date(date_breaks = "3 month",
date_labels = "%m/%y")2 - Cores
As cores padrões nos gráficos são úteis, mas nem sempre atrativas.
A seguir, vamos discutir como fazer modificações na escala de cores de uma visualização.
2.1 - Especificando cores manualmente
A seguir, vamos criar um gráfico de barras empilhadas para as variáveis setor e sexo do objeto survey.
# criando um gráfico de barras empilhadas
survey |>
ggplot(mapping = aes(x = setor,
fill = factor(sexo,
labels = c("Feminino","Masculino")))) +
geom_bar(position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = scales::percent) +
labs(x = "Setor",
y = "Proporção",
fill = "Gênero")É possível modificarmos as cores das categoris de sexo manualmente. Para isso, vamos usar o scale_fill_manual e especificar um vetor com cores para cada uma das categorias da variável sexo.
# modificando as cores manualmente
survey |>
ggplot(mapping = aes(x = setor,
fill = factor(sexo,
labels = c("Feminino","Masculino")))) +
geom_bar(position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = scales::percent) +
labs(x = "Setor",
y = "Proporção",
fill = "Gênero") +
scale_fill_manual(values = c("darkred", "steelblue"))2.2 - Paletas de cores
Além de definir manualmente, é possível usar paletas de cores já prontas no R. Existem muitas opções de paletas, talvez as mais conhecidas são a RColorBrewer e Viridis.
Abaixo são apresentadas paletas de cores no RColorBrewer.
A seguir vamos criar uma variável r
# fazendo o plot para a variável setor salario categorizado
survey |>
mutate(remun_cat = cut(remuneracao,
breaks = c(0,4,8,15,100),
labels = c("Muito Baixa",
"Baixa",
"Satisfatória",
"Alta"))) |> ggplot(mapping = aes(x = setor,
fill = remun_cat)) +
geom_bar(position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = scales::percent) +
labs(x = "Setor",
y = "Proporção",
fill = "Remuneração") +
scale_fill_brewer(palette = "PuBu") +
theme_classic()É possível inverter a ordem das cores usando o argumento direction = -1.
# fazendo o plot para a variável setor salario categorizado
survey |>
mutate(remun_cat = cut(remuneracao,
breaks = c(0,4,8,15,100),
labels = c("Muito Baixa",
"Baixa",
"Satisfatória",
"Alta"))) |> ggplot(mapping = aes(x = setor,
fill = remun_cat)) +
geom_bar(position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = scales::percent) +
labs(x = "Setor",
y = "Proporção",
fill = "Remuneração") +
scale_fill_brewer(palette = "PuBu",
direction = -1) +
theme_classic()Usando a escala viridis a função será a scale_fill_viridis_d.
# fazendo o plot para a variável setor salario categorizado
graf_viridis = survey |>
mutate(remun_cat = cut(remuneracao,
breaks = c(0,4,8,15,100),
labels = c("Muito Baixa",
"Baixa",
"Satisfatória",
"Alta"))) |> ggplot(mapping = aes(x = setor,
fill = remun_cat)) +
geom_bar(position = "fill") +
scale_y_continuous(breaks = seq(0, 1, .2),
label = scales::percent) +
labs(x = "Setor",
y = "Proporção",
fill = "Remuneração") +
scale_fill_viridis_d()
# Visualizando o gráfico
graf_viridis3 - Legenda
No pacote ggplot2, legendas são automaticamente criadas se no mapeamento da função ggplot for utilizado variáveis para os argumentos color, fill, linetype, shape, size ou alpha.
Podemos posicionar uma legenda usando a função theme.
# mudando a posição da legenda
graf_viridis +
theme(legend.position = "top")graf_viridis +
theme(legend.position = "left")graf_viridis +
theme(legend.position = "none")Para modificar o título da legenda, basta modificarmos em labs o argumento usado no mapeamento da função ggplot que criou a legenda.
# mudando o título da legenda
graf_viridis +
labs(fill = "Remuneração\nsalarial")4 - Anotações
Anotações são informações extras adicionadas aos gráficos para destacar pontos importantes.
Vamos voltar ao gráfico de dispersão entre peso e cilindrada do carro. Seria possível identificar o carro a que cada ponto se refere? Existem algumas formas de fazermos isso. A primeira é usando o geom_text.
# incluindo os nomes dos carros
base_carros |>
ggplot(mapping = aes(x = disp,
y = wt)) +
geom_point(color = "blue") +
geom_text(aes(label = nome)) +
theme_classic()O gráfico apresenta alguns problemas, pois fica difícil ler os nomes de alguns carros. Para este problema, podemos usar a função geom_text_repel.
# carregando o pacote
library(ggrepel)
# incluindo os nomes dos carros de uma forma diferente
base_carros |>
ggplot(mapping = aes(x = disp,
y = wt)) +
geom_point(color = "blue") +
geom_text_repel(aes(label = nome),
size = 3) +
theme_classic()É possível inclusive incluir alguma anotação no gráfico.
# incluindo uma anotação no gráfico
base_carros |>
ggplot(mapping = aes(x = disp,
y = wt)) +
geom_point(color = "blue") +
geom_text_repel(aes(label = nome),
size = 3) +
theme_classic() +
annotate("text",
200, 5,
label="A relação entre as variáveis \n é positiva",
color = "red",
hjust = 1)5 - Destacando um certo grupo
Muitas vezes, gostaríamos de destacar um determinado grupo na visualização criada. Isso é possível usando o pacote gghighlight. Abaixo são apresentados alguns gráficos já criados, destacando-se algum subgrupo.
# carregando pacote
library(gghighlight)
# destacando quem possui 8 cilindros
base_carros |>
ggplot(mapping = aes(x = disp,
y = wt)) +
geom_point(color = "blue") +
gghighlight(cyl == 8)# carregando pacote
library(gghighlight)
# destacando o setor fabrica
survey |>
ggplot(mapping = aes(x = setor)) +
geom_bar(fill = "red") +
gghighlight(setor == "fabrica")