Visualização de Dados (parte 01)

Análise de Dados Financeiros e Econômicos com o R

Marcelo S. Perlin

EA-UFRGS

01/10/2026

Objetivos de aprendizagem

O que vamos aprender

Ao final desta aula, você será capaz de:

  • Explicar os princípios fundamentais de uma boa visualização de dados.
  • Identificar erros comuns em gráficos e propor melhorias.
  • Construir gráficos com o ggplot2 a partir da lógica de camadas.
  • Aplicar paletas de cores, temas e facetas.
  • Exportar figuras para arquivos de imagem com o ggsave().

Introdução

Visualização de dados é a arte de transformar medidas em padrões visuais.

  • O objetivo é incrivelmente simples, apresentar evidências de um evento ou causalidade do mundo real.
  • Impressões visuais nunca foram tão importantes quanto hoje. Um gráfico apresentado em um relatório técnico ou trabalho acadêmico pode facilmente viralizar em plataformas como Instagram e Facebook.
  • Aprender a construir figuras impactantes é um diferencial no mercado de trabalho.

O Gráfico do Jeremy Siegel

  • “Investindo em Ações no Longo Prazo: O Guia Indispensável do Investidor do Mercado Financeiro”

O gráfico original

Alguns pontos

Nota-se os seguintes pontos e decisões dos autores:

  1. Todos os diferentes investimentos – dólar, ações, dívida pública americana — começam com um dólar.

  2. O melhor investimento, ações, possui uma linha mais forte no gráfico.

  3. A escala do eixo vertical é não-linear.

  4. O valor final do investimento é apresentado numericamente na direita do gráfico.

  5. A tabela no lado esquerdo superior do gráfico mostra o retorno anualizado de cada investimento

Exemplos Reais

The Academic Downturn: the Impact of COVID-19 in the Brazilian Academic Output

Estimates of DiD Model

The determinants and impact of research grants: The case of Brazilian productivity scholarships

Evolution of PQ scholarships

What is the sustainable withdraw rate for Brazil?

Safe withdraw rates

The Economic Rewards of Generative AI Writing in Science

AI usage by Field

Princípios de Visualização de Dados

Introdução

A razão principal da análise de dados é a comunicação de ideias.

Princípios de visualização

  • Independência do elemento gráfico: Todas informações técnicas, como origem e período de dados, devem ser claramente indicadas no título, subtítulo ou legenda do gráfico.

  • Transmissão de informação: Use cores, formas, tamanho e transparência para distinguir efeitos e adjetivos (bom/ruim, lucro/prejuízo) dentro dos dados.

  • Manipulação da atenção: Use e abuse de formas visuais de chamar a atenção. O melhor gráfico é aquele que não precisa ser explicado.

  • Herança e reprodutibilidade: Ao escrever um código de criação de figuras, busque que o mesmo seja facilmente reproduzível no futuro.

Um exemplo: visualizando a inflação para o Brasil

Gráfico de exemplo para a inflação Brasileira

  • Qual o objetivo do gráfico e porque está sendo apresentado?
  • O que os valores do eixo vertical representam exatamente?
  • De onde os dados saíram e como o gráfico pode ser replicado?
  • Mais importante, qual a mensagem transmitida?

Uma versão melhorada

Gráfico melhorado para a inflação Brasileira

Comparação Visual

Versão original (esquerda) e versão melhorada (direita)

Explicação

Comparando a primeira com a segunda versão, vemos as seguintes diferenças:

  1. Elementos textuais – o título e o subtítulo já indicam o que estamos analisando no gráfico e qual a mensagem.

  2. Elementos gráficos – uso de cores para distinguir os períodos de alta inflação dos períodos de baixa, reforçando e salientando a variação da inflação entre os meses.

  3. Reprodutibilidade. Depois do código montado, uma mudança nos dados não exige mudança no código pois todos os elementos são baseados nos dados de entrada.

Erros comuns

  • Eixos truncados (começar o eixo y longe do zero para exagerar diferenças).
  • Dois eixos verticais com escalas diferentes no mesmo gráfico.
  • Gráficos de pizza com muitas categorias.
  • Excesso de cores, fontes e elementos decorativos (chartjunk).
  • Falta de contexto: sem título, unidade ou fonte dos dados.

Veja mais exemplos no r/dataisugly.

Construindo gráficos com o ggplot2

Introdução

O pacote ggplot2 (Wickham et al. 2023) é a principal ferramenta de visualização de dados do R.

  • Criado por Hadley Wickham e Winston Chang, ambos cientistas de dados da empresa Posit (anteriormente chamada de RStudio).

  • Usado por diferentes mídias profissionais (BBC, NY Times, ..) para criar gráficos

  • Utiliza uma abordagem voltada a sobreposição de camadas, a chamada “Gramática de Gráficos” (Grammar of Graphics)

Exemplo BBC (British Broadcast Corporation)

Exemplo BBC

A anatomia de um gráfico ggplot2

Todo gráfico do ggplot2 é montado pela combinação de poucos componentes:

  • dados (data): o dataframe de origem;
  • estéticas (aes): o mapeamento de variáveis para canais visuais (x, y, cor, tamanho…);
  • geometrias (geom_*): como os dados aparecem (linhas, pontos, barras…);
  • escalas (scale_*): como os valores viram posições, cores e tamanhos;
  • facetas (facet_*): a divisão em subgráficos;
  • temas (theme_*): os elementos que não representam dados (fontes, fundos, bordas).
ggplot(data = df, aes(x = ..., y = ...)) +
  geom_*() +
  scale_*() +
  facet_*() +
  theme_*()

O sistema de camadas do ggplot2

  • O módulo ggplot2 funciona a partir da sobreposição de camadas gráficas.

A primeira camada do gráfico é dada pelo comando ggplot2::ggplot() :

library(ggplot2)

name_file <- "Chapter02-PETR-stock-2015-2022.csv"
df_yf <- vdr::data_import(name_file)

p0 <- ggplot(
  data = df_yf,
  mapping = aes(x = ref_date, y = price_adjusted)
)

print(p0)

Canvas vazio criado com comando ggplot()

Com a primeira camada definida, usamos variáveis de datas do R na adição dos elementos textuais do gráfico com o comando ggplot2::labs() :

min_year <- lubridate::year(min(df_yf$ref_date))
max_year <- lubridate::year(max(df_yf$ref_date))
today <- format(Sys.Date(), "%d/%m/%Y")

this_title <- stringr::str_glue(
  "Preços da Petrobrás ({min_year} - {max_year})"
)
this_subtitle <- "Preços ajustados a eventos corporativos"
this_caption <-  stringr::str_glue(
  "Dados obtidos do Yahoo Finance em {today}"
)

p1 <- p0 +
  labs(title = this_title,
       subtitle = this_subtitle,
       x = "Datas",
       y = "Preços",
       caption = this_caption
  )

print(p1)

Adição de camada de texto

Agora, adicionamos o miolo do gráfico – componente gráfico – como um canal de linha.

p2 <- p1 +
  geom_line()

print(p2)

Adição da camada de linha

Adicionalmente, além da camada de linhas, podemos também inserir uma camada com pontos e mudar o tema do gráfico:

p3 <- p2 +
  geom_point() +
  theme_light()

print(p3)

Adição de camada com pontos e tema suave/light

O resultado das adições das camadas:

Etapas de construção de uma figura com o ggplot2

Aplicação com dados reais

Primeiro, vamos carregar os dados financeiros de índices do mercado Brasileiro e internacional, e verificar o formato do dataframe:

df_yf <- vdr::data_import(
  "Chapter03-bvsp-ftse-sp500-2015-2022.csv"
  )

glimpse(df_yf)
Rows: 264
Columns: 11
$ ticker                 <chr> "^BVSP", "^BVSP", "^BVSP", "^BVSP", "^BVSP", "^…
$ ref_date               <date> 2015-01-02, 2015-02-02, 2015-03-02, 2015-04-01…
$ volume                 <dbl> 77719800, 65310100, 79890000, 81114600, 6784570…
$ price_open             <dbl> 47759, 51760, 51243, 55312, 53974, 53014, 49897…
$ price_high             <dbl> 50281, 52457, 52319, 56965, 58575, 54361, 53456…
$ price_low              <dbl> 46484, 46760, 47905, 51186, 52760, 52548, 48624…
$ price_close            <dbl> 46908, 51583, 51150, 56229, 52760, 53081, 50865…
$ price_adjusted         <dbl> 46908, 51583, 51150, 56229, 52760, 53081, 50865…
$ ret_adjusted_prices    <dbl> NA, 0.099663170, -0.008394238, 0.099296188, -0.…
$ ret_closing_prices     <dbl> NA, 0.099663170, -0.008394238, 0.099296188, -0.…
$ cumret_adjusted_prices <dbl> 1.0000000, 1.0996632, 1.0904323, 1.1987081, 1.1…

Em seguida, vamos criar a primeira camada do gráfico do ggplot2 e adicionar a camada de linhas, definindo também que os tipos de linhas que devem ser diferentes para cada índice (color = "ticker").

p <- ggplot(
  data = df_yf,
  mapping = aes(
    x = ref_date,
    y = cumret_adjusted_prices,
    color = ticker
    )
  ) + 
  geom_line()

p

Retorno acumulado para diferentes índices

Alternativamente, poderíamos usar os tipos de linhas como diferenciador de índices:

p <- ggplot(
  data = df_yf,
  mapping = aes(
    x = ref_date,
    y = cumret_adjusted_prices,
    linetype = ticker
    )
  ) + 
  geom_line()

p

Exemplo de uso de linetype

Paletas de cores

  • A melhor forma de lidar com cores no ggplot2 é através de uma paleta temática de cores pré-estabelecidas.

  • O grande benefício é poder, em uma linha de código, adicionar um efeito de cor que automaticamente se adapte aos dados.

Tipos de paletas

sequenciais: paletas que indicam diferentes intensidades, podendo se utilizar de tom único ou múltiplo;

divergentes: paletas que realçam a diferença entre extremos dos dados, tal como máximo e mínimo;

qualitativas: paletas para diferenciar grupos nos dados.

Paleta de cores do colorspace (Ihaka et al. 2023)

Code
colorspace::hcl_palettes(plot = TRUE)

Paletas de cores disponíveis em colorspace

Aplicação de paleta qualitativa

Code
p <- ggplot(
  data = df_yf,
  mapping = aes(
    x = ref_date,
    y = cumret_adjusted_prices,
    color = ticker
    )
  ) + 
  geom_line(linewidth = 2)

Gráfico base

Code
p

Paleta qualitativa “Cold”

Code
p + colorspace::scale_color_discrete_qualitative('Cold') 

Exercício rápido

Explore as paletas disponíveis com colorspace::hcl_palettes(plot = TRUE) e aplique ao gráfico de índices uma paleta sequencial diferente de 'Grays'.

  • Dica: use colorspace::scale_color_continuous_sequential().

Aplicação de paleta sequencial

Code
p <- ggplot(
  data = df_yf,
  mapping = aes(
    x = ref_date,
    y = cumret_adjusted_prices,
    color = cumret_adjusted_prices,
    group = ticker
    )
  ) + 
  geom_line(linewidth = 2)

Gráfico base

Code
p

Paleta sequencial “Grays”

Code
p + colorspace::scale_color_continuous_sequential('Grays') 

Acessibilidade e cores

  • Cerca de 8% dos homens têm algum grau de daltonismo.

  • Nunca dependa apenas da cor para transmitir informação: combine com formas, tipos de linha ou rótulos.

  • Prefira paletas seguras para daltonismo, como as da família viridis ou as geradas pelo colorspace.

Code
colorspace::demoplot(
  colorspace::sequential_hcl(5, "Viridis"),
  type = "heatmap"
)

Exemplo de paleta segura para daltonismo

Temas

Temas do ggplot2 são nada mais que configurações pré-definidas que podem ser aplicadas a qualquer gráfico.

Os temas controlam tudo que for editável no gráfico, incluindo:

  • tipo e tamanho das fontes do texto;
  • cores de fundo;
  • posição de títulos e subtítulos;
  • uso de formatação das bordas da figura;

Exemplo de aplicação

Tema básico

Code
p_tema

Tema clássico

Code
p_tema + theme_classic()

Painéis e facetas

Facetas são subgráficos criados pela divisão dos dados em grupos

Code
df_yf <- vdr::data_import(
  "Chapter04-stocks-by-country-2015-2022.csv"
)

p <- ggplot(df_yf, 
            aes(x = ref_date, 
                y = cumret_adjusted_prices, 
                color = ticker)) + 
geom_line() +
labs(title = "Desempenho de ações") +
theme_light() + 
facet_wrap(facets = "country", 
           nrow = 3)

p

Facetas em grade (grids bidimensionais)

  • Além de facet_wrap(), podemos dividir os dados em duas dimensões com facet_grid().
Code
df_yf_filtered <- df_yf |>
  mutate(year = lubridate::year(ref_date)) |>
  filter(year >= 2020)

p <- ggplot(df_yf_filtered, 
            aes(x = ref_date, 
                y = cumret_adjusted_prices, 
                color = ticker)) + 
  geom_line() +
  labs(title = "Desempenho de ações") +
  theme_light() + 
  facet_grid(rows = vars(country), 
             cols = vars(year))

p

Exportando figuras

Introdução

  • Existem três formatos comumente utilizados

    • png (Portable Network Graphics): compacto e equilibrado para qualidade
    • jpeg (Joint Photographic Experts Group): compacto e também equilibrado para qualidade
    • eps (Encapsulated PostScript): não-compacto e focado em qualidade
  • A sugestão é para focos em arquivos .png!

  • Sugiro colocar o texto fig no início do arquivo de figura, tal como em fig-Ibovespa.png.

  • Controle o tamanho físico da figura com width, height e units ("in", "cm", "mm").

  • Controle a resolução com dpi (300 é um bom padrão para impressão).

  • Para relatórios e artigos, prefira formatos vetoriais (pdf/svg), que não perdem qualidade ao serem ampliados.

No ggplot2 , salvamos figura com o comando ggplot2::ggsave() :

Code
library(ggplot2)

p <- ggplot(data = iris, 
            mapping = aes(y = Species, 
                          x = Sepal.Length)) + 
  geom_point()

f_fig <- tempfile(pattern = "fig-example-", 
                  fileext = '.png')
                  
ggsave(filename = f_fig,
       plot = p, 
       width = 10,
       height = 10,
       units = "cm",
       dpi = 300)

Resumo da aula

O que vimos

  • Bons gráficos nascem de princípios: clareza, reprodutibilidade e foco na mensagem.
  • O ggplot2 constrói figuras por camadas: dados + estéticas + geometrias + escalas + facetas + temas.
  • Paletas de cores e temas dão o acabamento profissional à figura.
  • Facetas permitem comparar subgrupos dentro de um mesmo gráfico.
  • ggsave() exporta a figura com controle de tamanho e resolução.
  • Na aula 08 veremos mapas e programação com o ggplot2.

Tarefa final de aula

Tarefa 04 (visualização de dados – parte 01)

A numeração das tarefas é independente da numeração das aulas. O gabarito desta tarefa está no arquivo quarto-tarefa-04.qmd.

01 - O grupo LatinoMetrics produz e distribui um conteúdo muito interessante de visualização de dados econômicos para a América Latina. Observando o material do Instagram, visualize as seis últimas imagens disponibilizadas na página principal. Observando as figuras como um todo, destaque os elementos comuns na criação das imagens. Isto é, destaque os elementos visuais que foram repetidos entre uma figura e outra.

02 - No Reddit é possível encontrar o grupo r/dataisugly, o qual contém inúmeros posts sobre visualizações de dados realizadas da forma errada. Na data de 27/09/2022 foi publicada a seguinte mensagem no fórum. Analise o gráfico e, sem buscar a resposta no fórum, indique qual o problema com o gráfico.

03 - Em 22/09/2022, o grupo LatinoMetrics publicou uma visualização de dados a respeito da impressão de confiança da população brasileira em relação às diferentes mídias jornalísticas. O conteúdo pode ser acessado no Instagram. Observando a figura, destaque os elementos textuais e gráficos utilizados pelo autor.

04 - Statspanda é outro grupo especializado em produção de conteúdo relacionado a visualização de dados, porém com assuntos muito mais abrangentes que o LatinoMetrics. Em 17/09/2022, o grupo publicou a seguinte figura no Instagram. Neste caso, quais foram os elementos gráficos utilizados pelo autor e como os mesmos se associam a mensagem da figura.

05 - No Reddit/dataisbeautiful é possível encontrar a visualização da receita de todos os filmes da franchise Star Wars. Apesar de ser esteticamente interessante, o mesmo poderia ser melhorado. Com base no que aprendeu neste capítulo do livro, analise o gráfico e faça recomendações para sua melhoria buscando sempre maior claridade e simplicidade.

06 - Em um novo script do R, crie um vetor de valores aleatórios da distribuição Normal com o comando rnorm(N), onde N é igual a 100. Agora, crie um gráfico de pontos onde o eixo y é representado pela série anterior, e o eixo x é simplesmente a contagem dos valores (1..100). Para este gráfico, utilize o template básico do ggplot2, isto é, não precisas modificar nenhum elemento textual do gráfico, por enquanto.

07 - Para o gráfico anterior, adicione os seguintes elementos textuais e gráficos:

  • título, subtítulo;
  • caption com a data e tempo de compilação do gráfico;
  • textos nos eixos x e y;
  • aplique o tema theme_light

08 - Para o mesmo gráfico anterior, adicione uma nova coluna chamada type no dataframe, a qual pode tomar o valor “A” ou “B”. Para isto, podes usar o comando sample(c("A", "B"), size = N, replace = TRUE). Note que o valor de N foi definido anteriormente. Com base no novo dataframe, crie um gráfico de linhas com cores diferentes para cada valor em type.

09 - Para o mesmo gráfico anterior, adicione uma camada de linhas no gráfico.

10 - Com base na função yfR::yf_collection_get, baixe os dados de preços de ações para a composição atual do índice Ibovespa, com início a cinco anos atrás e término como sendo a data atual. Com base nos dados importados, siga os seguintes passos:

  • filtre os dados para manter apenas as 5 ações com maior rentabilidade acumulada no período, e as 5 com menor.
  • construa uma figura com os retornos acumulados das 10 ações selecionadas anteriormente, onde o eixo horizontal representa as datas.
  • Implemente as seguintes modificações no gráfico:
    • Adicione título, subtítulo e caption e também o texto dos eixos horizontal e vertical;
    • modifique a escala do eixo vertical para percentagens com o comando scale_y_continuous(labels = scales::percent);
    • use o tema theme_light;
  • exporte a figura resultante para um arquivo de 10 cm (height) x 15 cm (width) chamado “fig-ibov-10-ações.png”, localizado na pasta padrão “Documentos” (atalho com ~).

Referências

Ihaka, Ross, Paul Murrell, Kurt Hornik, et al. 2023. Colorspace: A Toolbox for Manipulating and Assessing Colors and Palettes. https://colorspace.R-Forge.R-project.org/.
Wickham, Hadley, Winston Chang, Lionel Henry, et al. 2023. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://ggplot2.tidyverse.org.