Desvendando os Segredos da Visualização de dados

ggplot2 para Iniciantes

Marcel Ferreira

2024-08-20

Antes de começarmos..

Vamos instalar os pacotes necessários no R:

install.packages("tidyverse")
install.packages("dados")
install.packages("patchwork")
install.packages("ISLR")
install.packages("devtools")
install.packages("datasets")
install.packages("pokemon")
devtools::install_github("curso-r/basesCursoR")
install.packages("colourpicker")
install.packages("showtext")
install.packages("viridis")

Sobre este curso

  • Infelizmente esse curso é básico (😢) ;

  • Não é um curso sobre estatística;

  • Não é um curso sobre programação;

  • Este é um curso introdutório!

  • Não vamos discutir qual gráfico é melhor/mais bonito;

  • Caso tenha dúvida sobre algum tema acesse: apostila iniciante

Sobre mim

  • Física médica - IBB/UNESP (2011 - 2014);

  • Mestrado em Biotecnologia - IBB/UNESP (2015 - 2017);

  • Doutorado em Biotecnologia - IBB/UNESP (2017 - 2022);

  • Pós-doutorado em Genética - FMB/UNESP (2023 - );

Por que fazer gráficos por programação?

  • Reprodutibilidade;

  • Escalabilidade;

  • Customização;

Por que no R?

  • Ferramenta desenvolvida para análise de dados;

  • Gratuito;

  • Grande comunidade de usuários;

Por que no ggplot2?

  • Membro do tidyverse;

  • Construído baseado no livro Grammar of Graphics;

  • Possui mais de 100 extensões para diversas áreas;

  • Um dos pacotes mais utilizados em gráficos cientificos;

Exemplos no ggplot2

Grammar of graphics

The Grammar of Graphics

Leland Wilkinson (1944 - 2021)

Grammar of graphics: camadas

Camadas em um gráfico.

Camadas em um gráfico.
  • Temas;

  • Coordenadas;

  • Estatísticas;

  • Facetas;

  • Geometrias;

  • Estética;

  • Dados;

Grammar of graphics: camadas

Camadas em um gráfico.
  • Temas;

  • Coordenadas;

  • Estatísticas;

  • Facetas;

  • Geometrias;

  • Estética;

  • Dados;

Grammar of graphics: Dados

  • São o núcleo de um gráfico;

  • Devem ser importado/preparados no R;

  • Funções do pacote tidyverse simplificam demais este processo;

    “tidy data”

Grammar of graphics: Estética

  • Eixos (x, y), cores, formas, tamanho…

  • Quais variaveis (colunas) serão designada/mapeadas a cada elemento gráfico?

  • Ex: x, y, colour, fill, shape, size, label/text, …

Grammar of graphics: Geometrias

  • O gráficos será:

    • De pontos (scatterplot)?

    • Linhas (lineplot)?

    • Barras (barplot)?

    • Histograma?

    • Boxplot?

Gráfico simples

  • Para fazer um ggplot precisamos:

    • ggplot() para criar o gráfico;

    • aes() para especificar as estéticas;

    • + para adicionarmos camadas;

    • geom_*() para as geometrias escolhidas;

Gráfico simples

  • Comandos base:
# faz um gráfico de ponto
ggplot(dados, aes(x, y)) + 
  geom_point()
  • Outra opção:
# usando o pipe
dados %>% 
  ggplot(aes(x, y)) + 
  geom_point()

Gráfico simples

library(ggplot2)

data("airquality")

ggplot(airquality, aes(Temp, Ozone)) + 
  geom_point() + 
  geom_smooth(method = "loess")

# Dados: airquality
# Esteticas: {x = airquality, y = Ozone}
# Geometrias: {Pontos = geom_point, Regressão = geom_smooth}

Gráfico simples

  • Dados;
  • Estética;
  • Geometrias;

Gráficos simples - linhas

ggplot(economics, aes(date, uempmed)) +
  geom_line()

Gráficos - cores

Gráficos - texto

Fontes gratuitas do google: https://fonts.google.com/

Escalas

  • As funções scale_*() auxiliam a controlar as escalas das camadas de um gráfico;

    # Criar um gráfico de dispersão com o dataset iris
    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
      geom_point(size = 3) +
      labs(title = "Comprimento vs Largura da Sépala",
           x = "Comprimento da Sépala",
           y = "Largura da Sépala") +
      scale_color_manual(values = c("setosa" = "blue", "versicolor" = "green", "virginica" = "red")) +
      theme_minimal()

Escalas

Escalas

  • scale_x_*() - altera o eixo x (Análogo ao eixo y);

  • scale_colour_*() - altera as cores;

  • scale_fill_*() - altera os preenchimentos;

  • scale_size_*() - altera os tamanhos;

  • scale_shape_*() - altera as formas;

  • scale_alpha_*() - altera transparência;

Grammar of Graphics: Facetas

  • Cria tabelas de gráficos dividindo os dados em subconjuntos e apresentando o mesmo gráfico para cada subconjunto;

  • facet_wrap() ou facet_grid();

    ggplot(mpg, aes(displ, hwy)) + 
      geom_point() + 
      facet_wrap(~class)

Grammar of Graphics: Facetas

Grammar of Graphics: Estatísticas

  • Resumos estatísticos dos dados:

    • Discreto x, range: geom_errorbar(), geom_linerange()

    • Discreto x, range & center: geom_crossbar(), geom_pointrange()

    • Continuo x, range: geom_ribbon()

    • Continuo x, range & center: geom_smooth(stat = "identity")

Grammar of Graphics: Estatísticas

y <- c(18, 11, 16)

df <- data.frame(x = 1:3, y = y, se = c(1.2, 0.5, 1.0))

base <- ggplot(df, aes(x, y, ymin = y - se, ymax = y + se))

base + geom_crossbar()

Grammar of Graphics: Estatísticas

base + geom_pointrange()

Grammar of Graphics: Estatísticas

base + geom_errorbar()

Grammar of Graphics: Estatísticas

base + geom_smooth(stat = "identity")

Grammar of Graphics: Estatísticas

base + geom_linerange()

Grammar of Graphics: Estatísticas

base + geom_ribbon()

Grammar of Graphics: Estatísticas

# Calcular a média e o desvio padrão de mpg para cada número de cilindros
mpg_stats <- mtcars %>%
  group_by(cyl) %>%
  summarise(mean_mpg = mean(mpg),
            sd_mpg = sd(mpg),
            n = n(),
            se_mpg = sd_mpg / sqrt(n)) # Erro padrão

# Criar o gráfico de barras com barras de erro
ggplot(mpg_stats, aes(x = as.factor(cyl), y = mean_mpg, fill = as.factor(cyl))) +
  geom_bar(stat = "identity", color = "black") +
  geom_errorbar(aes(ymin = mean_mpg - se_mpg, ymax = mean_mpg + se_mpg), 
                width = 0.2, color = "black") +
  labs(title = "Consumo Médio de Combustível por Número de Cilindros",
       x = "Número de Cilindros",
       y = "Consumo Médio (mpg)",
       fill = "Cilindros") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Grammar of Graphics: Estatísticas

Grammar of Graphics: Coordenadas

  • Gráfico de pizza;

  • coord_polar();

    # Resumir os dados para obter a contagem de cada tipo de corte
    cut_data <- diamonds %>%
      group_by(cut) %>%
      summarise(count = n()) %>%
      mutate(percent = count/sum(count) * 100,
             label = paste0(cut, " (", round(percent, 1), "%)"))
    
    # Criar o gráfico de pizza
    ggplot(cut_data, aes(x = "", y = percent, fill = cut)) +
      geom_col(width = 1, color = "white") +
      coord_polar(theta = "y") +
      geom_text(aes(label = label), position = position_stack(vjust = 0.5)) +
      labs(title = "Distribuição dos Cortes de Diamantes",
           x = NULL,
           y = NULL,
           fill = "Tipo de Corte") +
      theme_void() +
      theme(plot.title = element_text(hjust = 0.5))

Grammar of Graphics: Coordenadas

Grammar of Graphics: Coordenadas

  • Mapas de calor (Heatmaps) são feitos via geom_tile();

  • coord_fixed() assegura que as células do mapa de calor sejam quadradas, o que facilita a comparação visual entre as diferentes correlações ou intensidades;

# Calcular a matriz de correlação
cor_matrix <- cor(mtcars)

# Transformar a matriz em um formato longo usando pivot_longer
cor_data <- as.data.frame(cor_matrix) %>%
  rownames_to_column(var = "Var1") %>%
  pivot_longer(cols = -Var1, names_to = "Var2", values_to = "value")

# Criar o mapa de calor
ggplot(cor_data, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1, 1), space = "Lab", 
                       name="Correlação") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, 
                                   size = 12, hjust = 1)) +
  labs(title = "Mapa de Calor das Correlações entre Variáveis",
       x = "Variáveis",
       y = "Variáveis") +
  coord_fixed()

Grammar of Graphics: Coordenadas

Grammar of Graphics: Temas

  • É a hora de deixar ele com a sua cara;

  • Alguns temas já são pré-definidos no ggplot2:

    • theme_bw();

    • theme_classic();

    • theme_void();

    • theme_dark();

    • theme_light();

  • Para ampla customização utilizamos a função theme() e passamos os valores utilizando funções element_*();

Como salvar/exportar?

  • Usamos a função ggsave();

Conclusão

Referências