Scatter Plot Matrix

Uma scatter plot matrix é uma tabela de gráficos de dispersão. Quando é necessário visualziar vários gráficos, ele pode ser muito útil. Além das duas variáveis, pode observar variáveis categóricas, por códigos de cores, linhas de regressão, etc. Vamos visualizar as variáveis métricas do conjunto de dados iris.

No R Base pode-se usar a função plot():

plot(iris[-5])

ou a função pairs(). O argumento bg controla a cor de preenchimento dos pontos, no caso, do tipo pch = 21.

    # Scatter plot matrix

pairs(iris[1:4], main = "Conjunto de Dados de Íris", pch = 21, 
    bg = c("red", "green3", "blue")[unclass(iris$Species)])

Aqui, o comando unclass(iris$Species) transforma os três níveis do fator Species em uma lista de 1s, 2s e 3s.

Ao analisarmos os diagramas de dispersão, é recomendável que cotejarmos os padrões visualizados com os coeficientes de correlação de cada par de variável. Assim, é bastante conveniente termos os coeficientes de correlação informado no próprio scatter plot. A função pairs() permite que escolhamos o que visualizar nos painéis da diagonal, da parte superior e inferior da matrix. Vamos criar a função painel.person para mostrar as correlações de cada par de variável no painel superior correspondente do gráfico em matriz.

painel.pearson <- function(x, y, ...) {
    horizontal <- (par("usr")[1] + par("usr")[2]) / 2;
    vertical <- (par("usr")[3] + par("usr")[4]) / 2;
    text(horizontal, vertical, format(abs(cor(x,y)), digits=2))
    }

Agora, o scatter plot matrix irá mostrar os diagramas de dispersão nos painéis inferiores e as correlações nos painéis superiores, com o argumento upper.panel = painel.pearson.

  # scatter plot matrix
pairs(iris[1:4], main = "Conjunto de Dados Íris", pch = 21, 
    bg = c("red","green3","blue")[unclass(iris$Species)], 
    upper.panel = painel.pearson)

Pode-se apresentar os diagramas em apenas uma das regiões da matriz (no caso, não plotando na região inferior, com lower.panel = NULL) e modificar a saída na diagonal, com os argumentos label,font.labelecex.label`.

    # Scatterplot Matrix com correlações e diagonal modificada

pairs(iris[1:4], main = "Conjunto de Dados Íris -- 3 espécies", pch = 21, 
    bg = c("red", "green3", "blue")[unclass(iris$Species)], 
    lower.panel = NULL, labels = c("SC", "SL", "PC", "PL"), font.labels = 2, 
    cex.labels = 4.5) 

A função painel.cor() apresenta nos painéis a correlação e o p-valor dos pares de variáveis

  # função para personalização painel
painel.cor <- function(x, y, digits = 2, cex.cor, ...){
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
        # correlation coefficient
      r <- cor(x, y)
    txt <- format(c(r, 0.123456789), digits = digits)[1]
    txt <- paste("r= ", txt, sep = "")
    text(0.5, 0.6, txt)
        # p-value calculation
      p <- cor.test(x, y)$p.value
    txt2 <- format(c(p, 0.123456789), digits = digits)[1]
      txt2 <- paste("p= ", txt2, sep = "")
    if(p<0.01) txt2 <- paste("p= ", "<0.01", sep = "")
    text(0.5, 0.4, txt2)
    }

O gráfico dos mesmos dados são apresentados, com os nomes das variáveis traduzidos e com as correlações e os p-valores de seus testes de significâncias

  # scatter plot matrix  
pairs(iris[,1:4], upper.panel = painel.cor,
    labels = c("Comprimento\nsépala", "Largura\nsépala", 
    "Comprimento\npétala", "Largura\npétala"))

O pacote colorspace tem paletes com cores mais equilibradas.

library(colorspace) # cores melhores
species.cores <- rev(rainbow_hcl(3))[as.numeric(iris$Species)]
  # Scatter plot matrix - SPloM:
pairs(iris[-5], col = species.cores, lower.panel = NULL,
    cex.labels = 1.7, pch = 19, cex = 1.2)
  # legenda
par(xpd = TRUE)
legend(x = 0.05, y = 0.4, cex = 1.5,
   legend = as.character(levels(iris$Species)),
    fill = unique(species.cores))

par(xpd = NA)

A função painel.densidade plota as regiões de densidade bivariada nos diagramas de dispersão e usa a função kd2e do pacote MASS.

library(MASS)
  # estimativas densidade bivariada por núcleo
painel.densidade <- function(x,y) {
    points(x,y)
    k <- kde2d(x,y)     # package: MASS
    cnt <- contourLines(k$x, k$y, k$z)
    n <- length(cnt)
    cols <- rev(sequential_hcl(n))
    for( i in seq_len(n) ) lines(cnt[[i]], col=cols[i])
}

O scatter plot matrix apresenta os diagramas de dispersão com as estimativas de densidade bivariadas codificadas por cor.

 # scatter plot matrix
pairs(iris[,1:4], panel = painel.densidade, 
    labels = c("Comprimento\nsépala", "Largura\nsépala", 
        "Comprimento\npétala", "Largura\npétala"))

As densidades bivariadas podem também ser visualizadas com a função smoothScatter() aplicada no argumento panel. A visualização fica interessante por apresentar a densidade por meio da concentração de cores. Poderíamos usar cores de um gráfico de calor.

    # Scatter plot matrix com densidade em intensidade de cores

pairs(iris[, 1:4], panel = function(...) smoothScatter(..., nrpoints = 0, 
    add = TRUE), gap = 0.2)

O pacote hexbin traz a função hexplomque desenha o scatter plot matrix com com cores relacionadas com as densidades bivariadas.

library(hexbin)
hexplom(iris[,1:4])

Outra visualização interessante é combinar o scatter plot matrix com a reta de regressão linear entre as variáveis. A função painel.reg personaliza o desenho das retas de regressão entre as variáveis nos diversos painéis da matriz.

  # função painel
painel.reg <- function(x, y, ...){
        points(x, y, ...)
        abline(lm(y ~x), col = "grey")
        }

A função pairs.panels(), do pacote psych pode também ser usada para criar um scatter plotmatrix, com daigramas de dispersão bivariados abaixo da diagonal, histogramas na diagonal e as correlações de Pearson, acima da diagonal.

library(psych)
pairs.panels(iris[,-5], 
             method = "pearson",         # método de correlação
             hist.col = "#00AFBB",
             density = TRUE,             # gráficos de densidades
             ellipses = TRUE             # mostra elipses de correlação
)

A função customiza painel.reg será usada para traçar a reta de regressão em todos os diagramas de dispersão. O argumento pch = ".", controlado por cex = 1.5, plota pontos menores nos diagramas e alivia a quantidade de informação visual do gráfico.

  # scatter plot matrix
pairs(iris[,1:4], panel = painel.reg, pch = ".", cex = 1.5,
    labels = c("Comprimento\nsépala", "Largura\nsépala", 
    "Comprimento\npétala", "Largura\npétala"))

Outra possibilidade é plotar nos diagramas de dispersão as linhas de regressão entre as variáveis, estimadas por núcleo. Pessoalmente, prefiro essa opção por dar liberdade ao formato da linha de regressão que pode indicar padrões difíceis de serem visualizados.

        # Scatterplot matrix com suavização por núcleo

pairs(iris[,1:4], panel = panel.smooth, pch = ".", cex = 1.5,
    labels = c("Comprimento\nsépala", "Largura\nsépala", 
    "Comprimento\npétala", "Largura\npétala"))

Uma opção interessante é plotar gráficos univariados na diagonal da matriz, como por exemplo os histogramas de cada variável. A função painel.histplota histograma nos painéis da diagonal prinicpal:

  # função painel
painel.hist <- function(x, ...){
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(usr[1:2], 0, 1.5) )
    h <- hist(x, plot = FALSE)
    breaks <- h$breaks; nB <- length(breaks)
    y <- h$counts; y <- y/max(y)
    rect(breaks[-nB], 0, breaks[-1], y, col = "cyan", ...)
    }

Assim, o Scatter plot matrix com linha de regressão suavizada por núcleo e com histogramas das variáveis na diagonal principal é obtida pelos comandos a seguir:

  # scatter plot matrix
pairs(iris[1:4], panel = panel.smooth,
      cex = 1, pch = 21, bg = "light blue",
      diag.panel = painel.hist, cex.labels = 1.4, font.labels = 2)

Painéis inferiores com correlações, com tamanho de texto proporcional às correlações. A seguir as funções para customização dos painéis:

# Painel de correlações proporcionais

painel.prop <- function(x, y){
  usr <- par("usr"); on.exit(par(usr))
  par(usr = c(0, 1, 0, 1))
  r <- round(cor(x, y), digits = 2)
  txt <- paste0("R = ", r)
  cex.cor <- 0.8/strwidth(txt)
  text(0.5, 0.5, txt, cex = cex.cor * r)
}

# Customização do painel superior

painel.superior <- function(x, y){
  points(x, y, pch = 19, col = cores[iris$Species])
}

O gráfico com cores customizadas.

  # cores
# ajuste das cores
cores <- c("#00AFBB", "#E7B800", "#FC4E07")
# Criação dos plots
pairs(iris[,1:4], 
      lower.panel = painel.prop,
      upper.panel = painel.superior)

Acrescentando o valor das correlações nos diagramas de dispersão, no painel superior.

  # Customização do painel superior

  painel.sup<-function(x, y){
    points(x, y, pch = 19, col = c("red", "green3", "blue")[iris$Species])
    r <- round(cor(x, y), digits = 2)
    txt <- paste0("R = ", r)
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    text(0.5, 0.9, txt)
  }
  
  # construção do gráfico
  
pairs(iris[,1:4], lower.panel = NULL, 
      upper.panel = painel.sup)

Scatter plot matrix vom o pacote GGally;

O pacote ggplot2 é um sistema gráfico baseado na gramática de gráficos e em grobs¨(graphical objecys*). O pacote GGallyestende o ggplot2 agregando várias funções para reduzir a complexidade na combinação de objetos geométricos com dados transformados.

library(GGally)

Usa-se então a função ggpairs() para desenhar os scatter plot matrix. Aplicado no conjunto de dados iris, seu default apresenta os diagramas de dispersão na porção da matriz inferior à diagonal proncipal, na porção superior são apresentados os coeficientes de correlação e na diagonal da matriz, as estimativas da densidade de cada variável.

  # default
ggpairs(iris[, 1:4])

Pode-se incluir todas as variáveis (default da função) e o gráfico bivariado entre a variável categórica e as contínua serão box-plots:

  # Todas as variáveis
ggpairs(data = iris, title = "Conjunto de Dados - iris")

O scatter plot matrix pode-se categorizar todas as informações pelos níveis da variável Species: pontos no diagrama de dispersão coloridos pelos níveis de Species, correlação em cada espécie e as curvas de densidade estimadas por nível de Species.

  # SPloM - cores por Species
ggpairs(data = iris,           #  data.frame com as variáveis
        columns = 1:4,       #   colunas a serem plotadas, default: todas
        title = "Conjunto de Dados - iris",
          mapping = ggplot2::aes(colour = Species))

O plot com todas as variável também apresentará os box-plots, agora coloridos pelos níveis da variável Species.

  # Todas as variáveis - cores por Species

ggpairs(data = iris, title = "Conjunto de Dados - iris",
      mapping = ggplot2::aes(colour = Species),
    lower = list(combo = wrap("facethist", binwidth = 1))
      )

Cada combinação de variáveis são plotadas de acordo com seu tipo:

  • Contínua: "points" (default da parte inferior da matrix), "smooth", "smooth_loess", "density", "cor" (default da parte superior da matriz) ou "blank".

  • Combo: "box", "box_no_facet" (default na parte superior), "dot", "dot_no_facet", "facethist", "facetdensity", "denstrip"ou "blank".

  • Discreta: "ratio", "facetbar"ou "blank".

Por outro lado os plots na diagonal podem ser:

  • Contínua: "densityDiag", "barDiag", "blankDiag".

  • Discreta: "barDiag", "blankDiag"

O termo facet se refere à divisão de um único gráfico em dois ou mais painéis (facets) e é um dos recursos bastante útil do ggplot2. Por exemplo, para plotar: diagramas de dispersão, com retas de regressão na parte inferior da matriz, com pontos menores e mais transparentes:

  # Retas de regressão e pontos menos - cores por espécies

ggpairs( data = iris,          #  data.frame com as variáveis
        columns = 1:4,         #   colunas a serem plotadas, default: todas
        title = "Conjunto de Dados - iris",
        lower = list(continuous = wrap("smooth", alpha = 0.3, size=0.1)),
        mapping = ggplot2::aes(colour = Species)
)

O plot p1 apresenta densidades bivariadas na parte superior da matriz e densidades por nível de Species nas relações entre esse fator e as demais variáveis. O grob p1 pode ser plotado a qualquer momento (e repetidas vezes) por meio do comando print().

  # controlando tipos de plot - plot 1
p1 <- ggpairs(data = iris,
          upper = list(continuous = "density"),
          lower = list(combo = "facetdensity"),
          title = "Conjunto de Dados - iris",
          mapping = ggplot2::aes(colour = Species))
print(p1)

O plot p2 apresenta a parte superior da matriz em branco, sem nomes dos eixos.

  # controlando tipo de plot - plot 2
p2 <- ggpairs(data = iris, 
              columns = c("Sepal.Length", "Sepal.Width", "Petal.Length",
                          "Petal.Width"), 
              lower = list(continuous='points'), 
              axisLabels = 'none',
              upper = list(continuous = 'blank'),
              mapping = ggplot2::aes(colour = Species)
)
print(p2)

Pode-se também combinar plots, criando por exemplo, o grob p3 com uma combinação do plot anterior (p2) com gráficos da função de distribuição empírica (stat_ecdf()),de cada variável, por espécie, na diagonal da matriz.

library(ggplot2)
for (i in 1:4) {
  p2 <- putPlot(p2, ggplot(data = data.frame(x = iris[, i], 
                                             Species = iris$Species), 
                           aes(x = x, colour = Species)) + 
                  stat_ecdf(), i,i)
}
print(p2)

O argumento legend.position da função theme()controla a posição da legenda, o argumento alpha regula a transaprência dos pontos (bastante útil quando há uma forte densidade de pontos em regiões do gráfico).

ggpairs(data = iris, 
        columns = 1:4,
        legend = 1,
        lower = list(continuous = wrap("smooth", alpha = 0.3, size=0.1)),
        mapping = ggplot2::aes(colour = Species)
        )  +
  theme(legend.position = "bottom")

Uso do argumento align_percent para mudar o alinhamento dos rótulos das correlações, se ajustando com os nomes dos níveis de Species. O ajuste do alpha permite observar as densidades mais com clareza. Os histogramas da combinação entre Speciese as demais variáveis são removidos.

ggpairs(data = iris, 
        title = "Um gráfico customizado usando ggpairs", 
        mapping = ggplot2::aes(colour = Species), 
        lower = list(continuous = wrap("smooth", alpha = 0.3, size = 0.5), 
                     discrete = "blank", combo="blank"), 
        diag = list(discrete = "barDiag", 
                    continuous = wrap("densityDiag", alpha = 0.5 )), 
        upper = list(combo = wrap("box_no_facet", alpha=0.5), 
                     continuous = wrap("cor", size = 4, align_percent = 0.8))) +
  theme(panel.grid.major = element_blank())    # remove gridlines 

Pode-se extrair painéis individuais e ou combinações deles usando getPlot()

p <- ggpairs(data = iris, 
             columns = 1:4, 
             title = "A Nice Plot Using ggpairs", 
             mapping = ggplot2::aes(colour = Species), 
             lower = list(continuous = wrap("smooth", alpha = 0.3, size = 0.1), 
                          discrete = "blank", combo = "blank"), 
             diag = list(discrete = "barDiag", 
                         continuous = wrap("densityDiag", alpha = 0.5)), 
             upper = list(combo = wrap("box_no_facet", alpha = 0.5),
                                 continuous = wrap("cor", size = 4, 
                                                   align_percent = 0.8))) + 
  theme(panel.grid.major = element_blank())    # remove gridlines 
getPlot(p, 3, 2) + guides(fill = FALSE)

Correlograma

Correlograma é uma gráfico da matriz de correlações. Ele é bastante útil para destacar as variáveis mais correlacionadas no conjunto de dados. Nesse gráfico, os coeficientes de correlação são coloridos de acordo com seu valor, assemelhando-se aos gráficps de calor (heatmaps). A matriz de correlações pode ser reordenadas de acordo com o grau de associação entre as variáveis. Há alguns pacotes que constroem esse tipo de gráfico.

Correlograma com o pacote GGally:

library(GGally)

A função ggcorr() constrói a matriz de correlações usando “gramática dos gráficos” implementada no ggplot2. A função ggcorr()pode ser carregada diretamente do endereço abaixo.

source("https://raw.githubusercontent.com/briatte/ggcorr/master/ggcorr.R")

Vamos considerar exemplo com as estatística da NBA, do blog Flowing Data, de Nathan Yau, que apresenta as estatísticas dos 50 maiores cestinhas da NBA. As variáveis do conjunto de dados são:

  • Name: nome dos top 50 scorers

  • G: Game

  • MIN: Minutes

  • PTS: Points

  • FGM: Field goal made

  • FGA: Field goal attempts

  • FGP: Field goal percent

  • FTM: Free throw made

  • FTA: Free throw attempt

  • FTP: Free throw percent

  • X3PM: Three pointers made

  • X3PA: Three points attempt

  • X3PP: Three points percent

  • ORB: Offensive rebounds

  • DRB: Defensive rebounds

  • TRB: Total rebounds

  • AST: Assists

  • STL: Steals

  • BLK: Blocks

  • TO:Turnovers

  • PF:

Você encontra mais informações sobre os dados aqui.

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dim(nba)
## [1] 50 21
str(nba)
## 'data.frame':    50 obs. of  21 variables:
##  $ Name: chr  "Dwyane Wade " "LeBron James " "Kobe Bryant " "Dirk Nowitzki " ...
##  $ G   : int  79 81 82 81 67 74 51 50 78 66 ...
##  $ MIN : num  38.6 37.7 36.2 37.7 36.2 39 38.2 36.6 38.5 34.5 ...
##  $ PTS : num  30.2 28.4 26.8 25.9 25.8 25.3 24.6 23.1 22.8 22.8 ...
##  $ FGM : num  10.8 9.7 9.8 9.6 8.5 8.9 6.7 9.7 8.1 8.1 ...
##  $ FGA : num  22 19.9 20.9 20 19.1 18.8 15.9 19.5 16.1 18.3 ...
##  $ FGP : num  0.491 0.489 0.467 0.479 0.447 0.476 0.42 0.497 0.503 0.443 ...
##  $ FTM : num  7.5 7.3 5.9 6 6 6.1 9 3.7 5.8 5.6 ...
##  $ FTA : num  9.8 9.4 6.9 6.7 6.9 7.1 10.3 5 6.7 7.1 ...
##  $ FTP : num  0.765 0.78 0.856 0.89 0.878 0.863 0.867 0.738 0.868 0.793 ...
##  $ X3PM: num  1.1 1.6 1.4 0.8 2.7 1.3 2.3 0 0.8 1 ...
##  $ X3PA: num  3.5 4.7 4.1 2.1 6.7 3.1 5.4 0.1 2.3 2.6 ...
##  $ X3PP: num  0.317 0.344 0.351 0.359 0.404 0.422 0.415 0 0.364 0.371 ...
##  $ ORB : num  1.1 1.3 1.1 1.1 0.7 1 0.6 3.4 0.9 1.6 ...
##  $ DRB : num  3.9 6.3 4.1 7.3 4.4 5.5 3 7.5 4.7 5.2 ...
##  $ TRB : num  5 7.6 5.2 8.4 5.1 6.5 3.6 11 5.5 6.8 ...
##  $ AST : num  7.5 7.2 4.9 2.4 2.7 2.8 2.7 1.6 11 3.4 ...
##  $ STL : num  2.2 1.7 1.5 0.8 1 1.3 1.2 0.8 2.8 1.1 ...
##  $ BLK : num  1.3 1.1 0.5 0.8 1.4 0.7 0.2 1.7 0.1 0.4 ...
##  $ TO  : num  3.4 3 2.6 1.9 2.5 3 2.9 1.8 3 3 ...
##  $ PF  : num  2.3 1.7 2.3 2.2 3.1 1.8 2.3 2.8 2.7 3 ...

Os dados são ordenados por pontos por jogo, do maior para o menor. Vamos fazer o contrário, para que seja do menor para o maior.

  # ordenação da menor pontuação para a maior
nba <- nba[order(nba$PTS), ]

Podemos também ordenar por assistências, bloqueios, etc. Além disso, desejamos denominar as linhas com o nome do jogador, ao invés do número da limha, além de remover a coluna Name:

  # mudança nome das linhas
row.names(nba) <- nba$Name
  # remoção "Name" (1a. coluna)
nba <- nba [, -1]

A matriz de correlações do conjunto de dados nba é:

  # matrix de correlações
nba.cor<-cor(nba)
head(round(nba.cor, 2))
##         G   MIN  PTS  FGM   FGA   FGP   FTM  FTA   FTP  X3PM  X3PA  X3PP   ORB
## G    1.00  0.19 0.06 0.04 -0.06  0.18 -0.01 0.01  0.04  0.14  0.11  0.12  0.05
## MIN  0.19  1.00 0.40 0.30  0.41 -0.22  0.27 0.18  0.22  0.13  0.13  0.11 -0.07
## PTS  0.06  0.40 1.00 0.85  0.83  0.07  0.67 0.61  0.03  0.03  0.04  0.01  0.01
## FGM  0.04  0.30 0.85 1.00  0.87  0.27  0.28 0.29 -0.13 -0.23 -0.22 -0.09  0.23
## FGA -0.06  0.41 0.83 0.87  1.00 -0.23  0.25 0.17  0.11  0.10  0.14 -0.02 -0.10
## FGP  0.18 -0.22 0.07 0.27 -0.23  1.00  0.07 0.25 -0.52 -0.64 -0.67 -0.16  0.66
##      DRB  TRB   AST   STL   BLK    TO    PF
## G   0.12 0.10  0.14 -0.03  0.13 -0.05 -0.03
## MIN 0.05 0.01  0.28  0.33 -0.07  0.32 -0.39
## PTS 0.25 0.17  0.22  0.36  0.24  0.34 -0.15
## FGM 0.38 0.34  0.11  0.22  0.33  0.14 -0.12
## FGA 0.08 0.02  0.17  0.33  0.00  0.16 -0.24
## FGP 0.61 0.65 -0.16 -0.23  0.68 -0.02  0.26

A função ggcor() é usada para construir o gráfico da matriz de correlações ou correlograma. Seu formato mais simplificado é:

  # correlograma default
ggcorr(nba)

A função gcorr() também aceita uma matriz de correlações por meio do argumento cor_matrix, sendo que nesse caso seu primeiro argumento deve ser NULL para indicar que a função deve usar a matriz de corrrelações. No exemplo abaixo, irá gerar o mesmo gráfico, agora com a matrz d correlações nba.cor:

 # correlograma default pela matriz de correlações
ggcorr(data = NULL, cor_matrix = nba.cor)

Pode-se usar com a função gcorr() todos os métodos de cálculo de correlação oferecidos por cor(). O método de cálculo das correlações é controlado pelo argumento method, especificando-se duas strings de caracteres.

A primeira string refere-se à seleção das observações que serão usadas. Essa string pode tomar um dos seguintes valores: "everything", "all.obs", "complete.obs", "na.or.complete" or "pairwise.complete.obs" (default de ggcorr()). Esses valores controlam como as covariâncias são calculadas na presença de dados faltantes. Verifique a documentação da função cor() pra conhecer a diferença entre cada valor.

A segunda string controla o tipo de coeficiente de correlação que será calculado. Há três valores possíveis: "pearson" (default das funções ggcorr() e cor()), "kendall" ou "spearman". Verifique a documentação da função cor() para conhecer cada valor. Em geral, a menos que os dados sejam ordinais, a escolha default deveria ser "pearson", que produz coeficientes de correlação baseados no método de Pearson.

Abaixo, alguns exemplos mostrando o uso de diferentes métodos na função ggcorr():

  # coeficiente de correlação de Pearson, com observações pairwise (default)
ggcorr(nba, method = c("pairwise", "pearson"))

  # oeficiente de correlação de Pearson, com todas observações
ggcorr(nba, method = c("everything", "pearson"))

  # coeficiente de correlação de Kendall, using observações completas
ggcorr(nba, method = c("complete", "kendall"))

  # coeficiente de correlações de Spearman, com observações estritamente completas
ggcorr(nba, method = c("all.obs", "spearman"))

Controle da escala de cores:

Por default, a função ggcorr() usa uma escala de cores contínua, no intervalo de -1 a 1 para mostrar a força das correlações representadas na matriz. Para mudar para cores categóricas, o usuário tem de acrescentar o argumento nbreaks, que especifica quantas classes a escala de cores deveria ter:

       # ----- Controle escala de cores  -------
ggcorr(nba[, 1:14], nbreaks = 5)

Quando o argumento nbreaks é usado, o número de dígitos mostrado na escala de cores é controlado pelo argumento digits. O default é digits = 2, mas ele será um único dígito se as classes não exegirem mais precisão.

O argumento name exerce controle adicional sobre a escala de cores, definindo seu nome; o argumento legend.size, que define o tamanho do texto da legenda, e o argumento legend.position, que controla onde a legenda será exibida. Os dois últimos são apenas atalhos para os mesmos argumentos no tema do ggplot2. Como o gráfico é um objeto ggplot2, todos os outros métodos relevantes também se aplicam:

  # controle legenda
ggcorr(nba[, 1:14], name = expression(rho), legend.position = "bottom", 
       legend.size = 12) +
  guides(fill = guide_colorbar(barwidth = 18, title.vjust = 0.75)) +
  theme(legend.title = element_text(size = 14))

Controle da palheta de cores:

A função ggcorr() usa o gradiente default de cores, que vai do vermelho brilhante ao cinza claro ao azul brilhante. Esse gradiente pode ser modificado pelos argumentos low, mid e high, que são semelhantes àqueles do argumento scale_gradient2 no ggplot2:

 # mudança gradiente de cores
ggcorr(nba[, 1:14], low = "steelblue", mid = "white", high = "darkred")

Por dafaul, o ponto central da escala de cores é ajustado para \(0\), indicando correlação nula. O argumento midpointpode ser usado para modificar esse ajuste. Em particular, para midpoint = NULL será selecionado automaticamente o coeficinte de correlação mediano como o ponto central da escala, mostrando no console esse valor:

  # centro da escala no coeficiente median
ggcorr(nba[, 1:14], midpoint = NULL)
## Color gradient midpoint set at median correlation to 0.08

Uma outra alternativa para controlar a escala de cores é usar uma palheta ColorBrewer no argumento palette. Esse argumento deveria ser usado somente quando a escala de cores for categórica, isto é, quando o argumento nbreaks estiver sendo usado.

ggcorr(nba[, 1:14], nbreaks = 4, palette = "RdGy")

Controle da geometria principal;

Por default, a função ggcorr() ele usa quadriculados coloridos para representar a força dos coeficientes de correlação, similar à maneira como os mapas de calor representam contagens de observações. As correlações podem ser representadas por círculos com tamanhos proporcionais a seus valores, ajustando seu argumeno geompara circle.

  # mudança na geomentria principal
ggcorr(nba[, 1:14], geom = "circle", nbreaks = 5)

Pode-se também ajustar os tamanhos mínimo e máximo dos círculos por meio dos argumentos min_size e max_size:

  # ajuste no tamanho dos círculos
ggcorr(nba[, 1:14], geom = "circle", nbreaks = 5, min_size = 0, max_size = 6)

Controle dos rótulos dos coeficientes:

A função ggcorr() pode mostrar os coeficientes de correlação na parte superior da matriz com o argumento label = TRUE:

  # ajuste rótulo dos coeficientes
ggcorr(nba[, 2:15], label = TRUE)

Os argumentos label_color e label_size permitem ajustar o estilo dos rótulos dos coeficientes:

  # estilo rótulos dos coeficientes
ggcorr(nba[, 1:14], nbreaks = 4, palette = "RdGy", label = TRUE, 
       label_size = 3, label_color = "white")

O argumento label_roundcontrola a quantidade de dígitos dos rótulos dos coeficientes, cujo default é um único dígito. Se o argumento label_alpha controla o nível de transparência: se label_alpha = TRUE, o nível de transpar~encia irá variar da mesma maneira que os coeficientes de correlação, aumentando à medida em que se afasta de 0:

  # nível de transparência
ggcorr(nba[, 1:14], label = TRUE, label_size = 3, label_round = 2, 
       label_alpha = TRUE)

Controle dos rótulos das variáveis:

Em muitas das situações anteriores, a compilação dos rótulos de variáveis (que são mostrados na diagonal da matriz de correlação) não é necessariamente a melhor. Para modificar o aspecto desses rótulos, usa-se qualquer argumento de geom_text(). O código abaixo, reduz o tamanho dos rótulos, os move para a esquerda e muda sua cor:

  # rótulo das variáveis
ggcorr(nba[, 1:14], hjust = 0.75, size = 5, color = "grey50")

Um provável problema com rótulos de variáveis em uma matriz de correlação é que eles poderão ser muito longos para serem exibidos por completo na parte inferior esquerda do gráfico. Este problema é ilustrado abaixo ao iniciar a matriz de correlação com a variável MIN, que parece estar ligeiramente cortada no canto inferior esquerdo do gráfico:

 # nome de variável cortado
ggcorr(nba[, 2:15], hjust = 0.75, size = 5, color = "grey50")

Para resolver esse problema, a função ggcorr permite acrescentar alguns espaços em branco no eixo horizontal do gráfico por meio do argumento layout.exp, acrescentando um ou mais “blocos invisíveis” à esquerda do gráfico, o que pode ajudar na exibição de variáveis com nomes longos:

  # ajsutando espaço à esquerda
ggcorr(nba[, 2:15], hjust = 0.75, size = 5, color = "grey50", layout.exp = 1)

Recortando a escala das correlações:

Pode-se mostrar o intervalo empírico dos coeficientes de correlação em vez do intervalo exato (-1, + 1) na escala de cores. Quando a escala de cores é um gradiente de cores contínuo, isso pode ser obtido definindo o argumento limits = FALSO:

  # mudança escala das correlações
ggcorr(nba[, 1:14], limits = FALSE)

Quando a escala de cores é categórica, serão eliminadas os intervalos que não correspondem a nenhum dos coeficientes de correlação, quando ajusta-se o argumento limits = FALSE ou, de forma equivalente, drop = TRUE:

ggcorr(nba[, 1:14], nbreaks = 9, limits = FALSE)
ggcorr(nba[, 1:14], nbreaks = 9,  drop = TRUE)

Mudando o estilo dos coeficientes de correlação:

Se geom = "text", a função ggcorr() apresentará os coeficientes de correlação com seu valores coloridos:

  # mudança de estilo dos coeficientes de correlação
ggcorr(nba[, 1:14], geom = "text", nbreaks = 5, palette = "RdYlBu", 
       hjust = 1)

O tamanho desses valors será ajustado para o tamanho especificado no argumento label_size, permitindo controlar os rótulos dos coeficientes:

  # controle dos rótulos dos coeficientes
ggcorr(nba[, 1:14], geom = "text", nbreaks = 5, palette = "RdYlBu", 
       hjust = 1, label = TRUE, label_alpha = 0.5)

Por outro lado, se ajusta-se geom = "blank", nada será plotado, que pode ser útil para controlar os valores internos do gráfico.

Controlando os valores internos do gráfico:

a função ggcorr() produz objetos gráficos (grobs) ggplot2. Para obter plots mais específicos desses objetos, convém compreendermos como esse obejto é construído. Todo objeto ggcorr contém os seguintes dados:

head(ggcorr(nba[, 1:14])$data, 5)
##     x y coefficient label
## 2 MIN G  0.18686608   0.2
## 3 PTS G  0.06309908   0.1
## 4 FGM G  0.03992195   0.0
## 5 FGA G -0.05958051  -0.1
## 6 FGP G  0.18087541   0.2

Isso permite ter um certo grau de controle aos valores internos de ggcorr. Por exemplo, realçar os coeficientes de correlação superiores a 0,5 e inferiores a -0,5, usando diferentes cores para os coeficientes positivos e negativos.

ggcorr(nba[, 1:14], geom = "blank", label = TRUE, hjust = 0.75) +
  geom_point(size = 10, aes(color = coefficient > 0, 
                            alpha = abs(coefficient) > 0.5)) +
  scale_alpha_manual(values = c("TRUE" = 0.25, "FALSE" = 0)) +
  guides(color = FALSE, alpha = FALSE)

Limitações:

a função ggcorr() é limitada exclusivamente a matrizes de correlação, não podendo construir mapas de calor (heatmaps) ou mapas de calor de agrupamentos (cluster heatmaps). Esse pode ser plotado com ggplot2, por meio do pacote gapmap.

Correlograma com o pacote corrplot:

O pacote corrplot temos mais funcionalidades gráficas e detalhes para apresentar as correlações, como por exemplo 7 tipos de visualização gráfica: círculos, quadrados, elipses, números, sombras, cores e gráficos de pizza“circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”.

library(corrplot)

Mapas de Calor

Referências

ggcorr: correlation matrixes with ggplot2 https://briatte.github.io/ggcorr/