\[ \cdot \]

Introdução

\(\qquad\) O pacote RMarkdown oferece uma funcionalidade para criar documentos HTML a partir de um arquivo R Markdown. Essa ferramenta possibilita a conversão do código R em saídas HTML, como tabelas, gráficos e visualizações interativas, que são incorporadas ao documento final. A opção de saída em HTML é uma das alternativas para gerar relatórios interativos que permitem a exploração dos gráficos de forma interativa.

\(\qquad\) Com a saída em HTML, é possível incluir gráficos interativos criados com o pacote Plotly diretamente em um documento HTML. Essa funcionalidade permite que os usuários interajam com os gráficos, ajustando eixos, visualizando informações adicionais ao passar o mouse sobre o gráfico, entre outras possibilidades. A interatividade é uma característica fundamental para a exploração de dados, já que permite que os usuários analisem visualmente as informações em diferentes perspectivas. A seguir, apresentaremos quatro exemplos.

# pacotes necessarios 
base::library(tidyverse)
base::library(plotly)
base::library(treemap)
base::library(reshape2)

\[ \cdots \]

1. Heatmap (Mapa de calor)

\(\qquad\) É um gráfico que mostra a intensidade de uma determinada variável por meio de cores em uma matriz. Ele é usado para visualizar relações entre duas variáveis contínuas em uma grande quantidade de dados. As cores podem ser usadas para representar diferentes níveis de intensidade, o que permite a fácil identificação de padrões. No nosso caso iremos usar o conjunto de dados Motor Trend Car Road Tests, mtcars. Esse conjunto de dados é bastante utilizado para estudo e já está disponível nos pacotes nativos do R. Vamos verificar o heatmap das correlações de Pearson das variáveis quantitativas contínuas.

mydata <- mtcars[, c(1,3,4,5,6,7)]

cormat <- round(cor(mydata), 2)
# melted_cormat <- reshape2::melt(cormat)

# Get lower triangle of the correlation matrix
get_lower_tri <- function(cormat){
    cormat[upper.tri(cormat)] <- NA
    return(cormat)
}
# Get upper triangle of the correlation matrix
get_upper_tri <- function(cormat){
    cormat[lower.tri(cormat)] <- NA
    return(cormat)
}

# upper_tri <- get_upper_tri(cormat)
# 
# melted_cormat <- reshape2::melt(upper_tri, na.rm = TRUE)

reorder_cormat <- function(cormat){
    # Use correlation between variables as distance
    dd <- as.dist((1-cormat)/2)
    hc <- hclust(dd)
    cormat <-cormat[hc$order, hc$order]
}

# Reorder the correlation matrix
cormat <- reorder_cormat(cormat)
upper_tri <- get_upper_tri(cormat)
# Melt the correlation matrix
melted_cormat <- reshape2::melt(upper_tri, na.rm = TRUE)
# Create a ggheatmap
ggheatmap <- ggplot2::ggplot(melted_cormat, ggplot2::aes(Var2, Var1, fill = value)) +
    ggplot2::geom_tile(color = "white")+
    ggplot2::scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                                  midpoint = 0, limit = c(-1,1), space = "Lab", 
                                  name="Pearson\nCorrelation") +
    ggplot2::theme_minimal()+ # minimal theme
    ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, vjust = 1, 
                   size = 12, hjust = 1))+
    ggplot2::coord_fixed()
## Warning in register(): Can't find generic `scale_type` in package ggplot2 to
## register S3 method.


ggheatmap + 
ggplot2::geom_text(ggplot2::aes(Var2, Var1, label = value), color = "black", size = 4) +
ggplot2::theme(
  axis.title.x = ggplot2::element_blank(),
  axis.title.y = ggplot2::element_blank(),
  panel.grid.major = ggplot2::element_blank(),
  panel.border = ggplot2::element_blank(),
  panel.background = ggplot2::element_blank(),
  axis.ticks = ggplot2::element_blank(),
  legend.justification = c(1, 0),
  legend.position = c(0.6, 0.7),
  legend.direction = "horizontal")+
  ggplot2::guides(fill = ggplot2::guide_colorbar(barwidth = 7, barheight = 1,
                title.position = "top", title.hjust = 0.5))

\[ \cdots \]

2. 3D Scatterplot (Gráfico de Dispersão 3D)

\(\qquad\) É um gráfico que mostra a relação entre três variáveis contínuas em um espaço tridimensional. Ele é útil para visualizar relações complexas entre variáveis, especialmente quando os dados não podem ser facilmente representados em um gráfico bidimensional. Por exemplo, pode-se usar um 3D Scatter Plot para analisar a relação entre a altura, o peso e a idade de um grupo de pessoas. No nosso caso iremos analisar os conjuntos de dados mtcars e iris. O conjunto de dados Iris também é bastante utilizado e já está instalado nos pacotes nativos do R.

# Carregar o conjunto de dados iris
utils::data(iris)

# Criar o gráfico 3D scatterplot
plotly::plot_ly(iris, x = ~Sepal.Length,
        y = ~Sepal.Width,
        z = ~Petal.Length,
        color = ~Species, colors = c("#F8766D",
                                     "#00BA38",
                                     "#619CFF"),
        marker = list(size = 3)) |>
  
  plotly::add_markers()
utils::data(mtcars)

mtcars$am[which(mtcars$am == 0)] <- 'Automatic'
mtcars$am[which(mtcars$am == 1)] <- 'Manual'
mtcars$am <- as.factor(mtcars$am)

fig <- plotly::plot_ly(mtcars,
               x = ~wt,
               y = ~hp,
               z = ~qsec,
               color = ~am, colors = c('#BF382A',
                                       '#0C4B8E'))

fig <- fig |> plotly::add_markers()
fig <- fig |> plotly::layout(scene = list(xaxis = list(title = 'Weight'),
                     yaxis = list(title = 'Gross horsepower'),
                     zaxis = list(title = '1/4 mile time')))

fig
fig <- plotly::plot_ly(mtcars,
               x = ~wt,
               y = ~hp,
               z = ~qsec,
               marker = list(color = ~mpg,
                             colorscale = c('#FFE1A1',
                                            '#683531'),
                             showscale = TRUE))
fig <- fig |> plotly::add_markers()
fig <- fig |> plotly::layout(scene = list(xaxis = list(title = 'Weight'),
                                  yaxis = list(title = 'Gross horsepower'),
                                  zaxis = list(title = '1/4 mile time')),
                      annotations = list(
                        x = 1.13,
                        y = 1.05,
                        text = 'Miles/(US) gallon',
                        xref = 'paper',
                        yref = 'paper',
                        showarrow = FALSE
                        ))
fig

\[ \cdots \]

3. 3D Bubbleplot (Gráfico de Bolhas 3D)

\(\qquad\) É semelhante ao 3D Scatter Plot, mas usa bolhas em vez de pontos para representar os dados. O tamanho da bolha é proporcional a uma quarta variável. Este gráfico é útil para visualizar grandes quantidades de dados, pois as bolhas podem sobrepor-se sem afetar a legibilidade. Por exemplo, pode-se usar um 3D Bubbleplot para analisar a relação entre o preço de uma ação, seu volume de negociação, sua capitalização de mercado e o retorno sobre o patrimônio líquido. No nosso caso iremos utilizar um conjunto de dados econômicos.

file <- "https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv"
data <- utils::read.csv(file)

data_2007 <- data[which(data$year == 2007),]
data_2007 <- data_2007[order(data_2007$continent, data_2007$country),]
data_2007$size <- data_2007$pop

colors <- c('#4AC6B7',
            '#1972A4',
            '#965F8A',
            '#FF7070',
            '#C61951')

fig <- plotly::plot_ly(data_2007,
               x = ~gdpPercap,
               y = ~lifeExp,
               z = ~pop,
               color = ~continent,
               size = ~size,
               colors = colors,
             marker = list(symbol = 'circle', sizemode = 'diameter'),
             sizes = c(5, 150),
             text = ~paste('Country:', country,
                           '<br>Life Expectancy:', lifeExp,
                           '<br>GDP:', gdpPercap,
                           '<br>Pop.:', pop))

fig <- fig |>
  plotly::layout(title = 'Life Expectancy v. Per Capita GDP, 2007',
         scene = list(xaxis = list(title = 'GDP per capita (2000 dollars)',
                      gridcolor = 'rgb(255, 255, 255)',
                      range = c(2.003297660701705, 5.191505530708712),
                      type = 'log',
                      zerolinewidth = 1,
                      ticklen = 5,
                      gridwidth = 2),

         yaxis = list(title = 'Life Expectancy (years)',
                      gridcolor = 'rgb(255, 255, 255)',
                      range = c(36.12621671352166, 91.72921793264332),
                      zerolinewidth = 1,
                      ticklen = 5,
                      gridwith = 2),

         zaxis = list(title = 'Population',
                      gridcolor = 'rgb(255, 255, 255)',
                      type = 'log',
                      zerolinewidth = 1,
                      ticklen = 5,
                      gridwith = 2)),

         paper_bgcolor = 'rgb(243, 243, 243)',
         plot_bgcolor = 'rgb(243, 243, 243)')

fig
## No trace type specified:
##   Based on info supplied, a 'scatter3d' trace seems appropriate.
##   Read more about this trace type -> https://plotly.com/r/reference/#scatter3d
## No scatter3d mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode

\[ \cdots \]

4. Tree map (Mapa de Árvore)

\(\qquad\) É um gráfico hierárquico que usa retângulos para representar hierarquias aninhadas de dados. Cada retângulo é dividido em sub-retângulos, representando as sub-hierarquias. O tamanho do retângulo é proporcional a uma determinada medida, enquanto a cor pode ser usada para representar outra medida. Este gráfico é útil para analisar grandes quantidades de dados hierárquicos. No nosso caso iremos gerar um conjunto de dados para facilitar o entendimento. Esses dados serão um exemplo de vendas por departamentos de uma determinada empresa de varejo.

# conjunto de dados fictício com 10 categorias e vendas simuladas
dados <- base::data.frame(
    Categoria = c("Eletrônicos", "Moda Feminina",
                  "Moda Masculina", "Livros",
                  "Alimentos", "Bebidas", "Artigos de Esporte",
                  "Jogos de Tabuleiro", "Produtos de Beleza", "Brinquedos"),
    Vendas = c(8500, 7100, 6400, 5600, 4800, 4200, 3500, 2800, 2100, 1400)
)

# treemap que mostre a distribuição de vendas por categoria
treemap::treemap(
    dados,
    index = "Categoria",
    vSize = "Vendas",
    type = "index",
    fontsize.labels = 12, 
    fontsize.title = 16
)

\[ \cdot \]