Gráfico de dispersão em R usando ggplot2 com exemplo

⚡ Resumo Inteligente

O gráfico de dispersão em R usando ggplot2 mapeia duas variáveis ​​contínuas para os eixos x e y com geom_point(). Este passo a passo aborda o agrupamento de variáveis ​​contínuas.ping por cor, transformações logarítmicas, linhas de regressão ajustadas, rótulos, facetas, correções de sobreposição, escalas, temas e salvamento.

  • 📍 Sintaxe básica: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() constrói o gráfico a partir de dados e mapa.pinge geometria.
  • ???? Colorir em grupo: aes(color = factor(gear)) dentro de geom_point() divide os pontos em uma cor por nível de fator.
  • 📈 Linhas de tendência: stat_smooth(method = “lm”) sobrepõe uma linha de regressão ajustada e se = FALSE remove a banda de confiança.
  • 🗂️ Facetamento: A função facet_wrap() desenha um painel por grupo em uma escala compartilhada, o que é melhor do que agrupar todas as séries em um único gráfico.
  • 🔁 Sobreplotação: Diminua o valor de alpha, aplique jitter nos pontos ou mude para geom_hex() quando os marcadores se acumularem uns sobre os outros.
  • 💾 Exportar: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) salva o último gráfico no diretório de trabalho.

Gráfico de dispersão em R usando ggplot2

Por que os gráficos são importantes na análise de dados?

Os gráficos são a terceira parte do processo de análise de dados. A primeira parte é sobre dados extracção, a segunda parte trata limpando e manipulando os dados. Por fim, o cientista de dados pode precisar comunicar seus resultados graficamente.

O fluxo de trabalho de um cientista de dados está resumido na imagem abaixo.

  • A primeira tarefa de um cientista de dados é definir uma questão de pesquisa. Esta questão de pesquisa depende dos objetivos e metas do projeto.
  • Depois disso, uma das tarefas mais importantes é a engenharia de recursos. O cientista de dados precisa coletar, manipular e limpar os dados
  • Quando esta etapa for concluída, ele poderá começar a explorar o conjunto de dados. Às vezes é necessário refinar e alterar a hipótese original devido a uma nova descoberta.

Gráfico de dispersão em R

  • Quando o explicativo análise é alcançada, o cientista de dados deve considerar a capacidade do leitor de compreender os conceitos e modelos subjacentes.
  • Os seus resultados devem ser apresentados num formato que todas as partes interessadas possam compreender. Um dos melhores métodos para comunicar os resultados são através de um gráfico.
  • Os gráficos são uma ferramenta incrível para simplificar análises complexas.

O restante deste tutorial ensina como construir esses gráficos usando o pacote ggplot2.

O pacote ggplot2

Este tutorial aborda a criação de gráficos em R com ggplot2.

Neste tutorial, você usará o pacote ggplot2. O pacote implementa a Gramática dos Gráficos descrita por Leland Wilkinson em 2005. O ggplot2 é flexível, vem com muitos temas e permite que você especifique um gráfico em um alto nível de abstração.tracObserve que ele não produz gráficos tridimensionais ou interativos; para isso, são necessários pacotes como plotly ou rgl.

No ggplot2, um gráfico é composto pelos seguintes argumentos:

  • dados,
  • mapa estéticoping
  • objeto geométrico
  • transformações estatísticas
  • Escalas
  • sistema de coordenadas
  • ajustes de posição
  • facetas

Você aprenderá como controlar esses argumentos no tutorial.

A sintaxe básica do ggplot2 é:

ggplot(data, mapping=aes()) +
geometric object 

arguments: 
data: Dataset used to plot the graph
mapping: Control the x and y-axis 
geometric object: The type of plot you want to show. The most common object are:
 
- Point: `geom_point()` 
- Bar: `geom_bar()`
- Line: `geom_line()` 
- Histogram: `geom_histogram()`

Como criar um gráfico de dispersão em R

Vamos ver como o ggplot funciona com o conjunto de dados mtcars. Você começa traçando um gráfico de dispersão da variável mpg e da variável drat.

Gráfico de dispersão básico

library(ggplot2)
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point()

Code Explicação

  • Primeiro você passa o conjunto de dados mtcars para o ggplot.
  • Dentro do argumento aes(), você adiciona o eixo xey.
  • O sinal + significa que você deseja que R continue lendo o código. Isso torna o código mais legível ao quebrá-lo.
  • Use geom_point() para o objeto geométrico.

Saída:

Gráfico de dispersão básico

Gráfico de dispersão com grupos

Às vezes, pode ser interessante distinguir os valores por um grupo de dados (ou seja, dados em nível de fator).

ggplot(mtcars, aes(x = mpg, y = drat)) +
    geom_point(aes(color = factor(gear)))

Code Explicação

  • A função `aes()` dentro de `geom_point()` controla a cor de cada grupo. O grupoping A variável deve ser um fator, portanto, a engrenagem é envolvida em factor().
  • Ao todo, você tem o código aes(color = factor(gear)) que altera a cor dos pontos.

Saída:

Gráfico de dispersão com grupos

Alterar a escala do eixo com uma transformação logarítmica

Redimensionar dados é uma parte importante do trabalho do analista, pois as variáveis ​​brutas raramente se apresentam em um formato de sino perfeito. Aplicar logaritmos é uma maneira de comprimir valores extremos e tornar o gráfico menos sensível a outliers.

ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear)))

Code Explicação

  • Você transforma as variáveis ​​x e y em log() diretamente dentro do mapa aes()ping.

Observe que qualquer outra transformação pode ser aplicada, como padronização ou normalização.

Saída:

Alterar eixo

Gráfico de dispersão com valores ajustados

Você pode adicionar mais um nível de informação ao gráfico. Você pode sobrepor os valores ajustados de um regressão linear.

my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear))) +
    stat_smooth(method = "lm",
        col = "#C42126",
        se = FALSE,
        size = 1)
my_graph

Code Explicação

  • `my_graph`: o gráfico é armazenado no objeto `my_graph`, permitindo que etapas posteriores adicionem camadas sem a necessidade de repetir toda a chamada.
  • O argumento stat_smooth() controla o método de suavização
  • método = “lm”: Regressão linear
  • col = “#C42126”: Code para a cor vermelha da linha
  • se = FALSE: Não exibe o erro padrão
  • size = 1: a espessura da linha. No ggplot2 3.4.0 e versões posteriores, esse argumento foi renomeado para linewidth para geometrias de linha.

Saída:

Gráfico de dispersão com valores ajustados

Observe que outros métodos de suavização estão disponíveis

  • glm
  • gam
  • loess: o padrão para menos de 1,000 observações
  • rlm: modelo linear robusto, do pacote MASS

Antes de formatar o gráfico, é importante saber quando um gráfico de dispersão é a escolha certa.

Gráfico de dispersão vs. gráfico de linhas vs. Bubble Gráfico em R

Os três modelos representam graficamente duas variáveis ​​contínuas em relação uma à outra, portanto a escolha se resume ao que o leitor deve extrair da mensagem.

Critérios Gráfico de dispersão Gráfico de Linhas Bubble gráfico
Shows Correlação entre duas variáveis Variação de uma variável ao longo de um eixo ordenado. Correlação mais uma terceira magnitude
Eixo X Qualquer variável contínua Geralmente, o tempo ou outra escala ordenada. Qualquer variável contínua
Ordem dos pontos Irrelevante Pontos críticos estão conectados Irrelevante
Terceira variável Através da cor ou da forma Por meio de linhas separadas Por tamanho de ponto
chamada ggplot2 geom_point() linha_geométrica() geom_point(aes(tamanho = z))

Conectar pontos dispersos com uma linha quando o eixo x não possui uma ordem natural é um erro comum: isso implica uma sequência que não existe. Reserve a função `geom_line()` para eixos ordenados, como datas. Para distribuições de uma única variável, use uma função de reta. gráfico de caixa ao invés.

Adicione informações ao gráfico

Até o momento, os gráficos não contêm texto explicativo. O leitor deve ser capaz de compreender a história a partir dos dados, apenas com base no gráfico, sem precisar consultar documentação adicional. Isso significa que o gráfico precisa de boas legendas. Você pode adicionar legendas com a função labs().

A sintaxe básica para labs() é:

labs(title = "Hello Guru99")
arguments:
- title: Main title displayed above the plot
- subtitle: Secondary line below the title
- caption: Note below the plot, usually the data source
- x: Rename the x-axis
- y: Rename the y-axis
- color / fill: Rename the legend

Example: labs(title = "Hello Guru99", subtitle = "My first plot")

Adicione um título

Uma informação obrigatória a adicionar é obviamente um título.

my_graph +
    labs(
        title = "Plot Mile per hours and drat, in log"
         )

Code Explicação

  • my_graph: você usa o gráfico armazenado. Evita reescrever todos os códigos cada vez que você adiciona novas informações ao gráfico.
  • Você envolve o título dentro de labs().

Saída:

Adicione um título

Adicione um título com um nome dinâmico

Um título dinâmico é útil para adicionar informações mais precisas ao título.

Você pode usar a função paste() para imprimir texto estático e texto dinâmico. A sintaxe básica de paste() é:

paste("This is a text", A)
arguments
- " ": Text inside the quotation marks are the static text
- A: Display the variable stored in A
- Note you can add as much static text and variable as you want. You need to separate them with a comma	

Exemplo:

A <- 2010
paste("The first year is", A)

Saída:

## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)

Saída:

## [1] "The first year is 2010 and the last year is 2018"

Você pode adicionar um nome dinâmico ao nosso gráfico, ou seja, a média de mpg.

mean_mpg <- mean(mtcars$mpg)
my_graph + labs(
    title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg)
)

Code Explicação

  • Você cria a média de mpg com mean(mtcars$mpg) armazenado na variável mean_mpg
  • Você usa paste() com mean_mpg para criar um título dinâmico retornando o valor médio de mpg

Saída:

Adicione um título com um nome dinâmico

Adicionar uma legenda

Dois outros detalhes tornam o gráfico mais explícito. Você está falando do subtítulo e da legenda. O subtítulo fica logo abaixo do título. A legenda pode informar quem fez o cálculo e a fonte dos dados.

my_graph +
    labs(
        title =
        "Relation between Mile per hours and drat",
        subtitle =
        "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Explicação

  • Dentro do laboratório (labs()), você adicionou:
    • title = “Relação entre milhas por hora e drat”: Adicionar título
    • subtitle = “Relacionamento dividido por classe de equipamento”: Adicionar legenda
    • caption = “Cálculo do próprio autor: Adicionar legenda
    • Você separa cada nova informação com uma vírgula, ,
  • Observe que você quebra as linhas de código. Não é obrigatório e só ajuda a ler o código com mais facilidade

Saída:

Adicionar uma legenda

Renomear eixo x e eixo y

Os nomes das colunas raramente estão prontos para apresentação. Muitas vezes são abreviados ou usam sublinhados entre as palavras, como em GDP_CAP. Renomeie-os no gráfico e adicione as unidades onde forem necessárias.

my_graph +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Explicação

  • Dentro do laboratório (labs()), você adicionou:
    • x = “Drat definição”: Altere o nome do eixo x
    • y = “Milhas por hora”: Altere o nome do eixo y

Saída:

Renomear eixo x e eixo y

Controle a balança

Você pode controlar a escala do eixo.

A função seq() é conveniente quando você precisa criar uma sequência numérica. A sintaxe básica é:

seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`	

Por exemplo, um intervalo de 0 a 12 com um passo de 4 retorna quatro números: 0, 4, 8 e 12.

seq(0, 12,4)

Saída:

## [1]  0  4  8 12

Você pode controlar a escala do eixo xey como abaixo

my_graph +
    scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
    scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code Explicação

  • A função scale_y_continuous() controla o eixo y
  • A função scale_x_continuous() controla o eixo x.
  • O parâmetro breaks controla a divisão do eixo. Você pode adicionar manualmente a sequência de números ou usar a função seq():
    • seq(1, 3.6, by = 0.2): Cria a sequência de 1 a 3.6 em passos de 0.2, ou seja, 14 pontos de quebra.
    • seq(1, 1.6, by = 0.1): Cria sete números de 1 a 1.6 em incrementos de 0.1

Saída:

Controle a balança

Tema

Por fim, o ggplot2 permite que você reestilize todo o gráfico com uma única função de tema. Oito temas completos são fornecidos com o pacote:

  • tema_bw()
  • tema_luz()
  • tema_clássico()
  • tema_linedraw()
  • tema_escuro()
  • tema_mínimo()
  • tema_cinza()
  • tema_void()
my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Saída:

Tema

Salvar parcelas

Após todas essas etapas, é hora de salvar e compartilhar seu gráfico. Chame ggsave(“nome_do_arquivo.png”) logo após plotar o gráfico e a imagem será gravada no disco.

O gráfico é salvo no diretório de trabalho. Para verificar o diretório de trabalho, você pode executar este código:

directory <- getwd()
directory

Trace o gráfico final, salve-o e verifique onde ele ficou:

my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Saída:

Salvar parcelas

ggsave("my_fantastic_plot.png")

Saída:

## Saving 5 x 4 in image

Observação: Apenas para fins pedagógicos, criamos uma função chamada open_folder() para abrir a pasta do diretório para você. Você só precisa executar o código abaixo e ver onde a imagem está armazenada. Você deverá ver um arquivo com o nome my_fantastic_plot.png.

# Run this code to create the function
open_folder <- function(dir) {
    if (.Platform['OS.type'] == "windows") {
        shell.exec(dir)
    } else {
        system(paste(Sys.getenv("R_BROWSER"), dir))
    }
}

# Call the function to open the folder
open_folder(directory)

Como criar gráficos de dispersão facetados em R com facet_wrap()

O facetamento é um dos oito componentes do ggplot2 listados anteriormente e é a solução mais elegante para um gráfico sobrecarregado. Em vez de comprimir todos os grupos em um único painel, o ggplot2 desenha um pequeno múltiplo para cada nível de uma variável, todos na mesma escala, para que os painéis permaneçam comparáveis.

# One panel per gear count
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point() +
    facet_wrap(~ gear) +
    theme_classic()

A maior parte do trabalho é feita por três argumentos.

  • ncol or agora: forçar os painéis a um determinado layout, por exemplo facet_wrap(~ gear, ncol = 2).
  • EscalasPor padrão, o valor é "fixo", portanto, todos os painéis compartilham o mesmo intervalo de eixo. Use "free_y" ou "free" quando os grupos apresentarem diferenças significativas de magnitude, mas esteja ciente de que escalas livres podem tornar a comparação visual entre os painéis enganosa.
  • rotulador: substitui o nível do fator bruto em cada tira, por exemplo, labeller = label_both para imprimir “engrenagem: 4” em vez de “4”.

Dois gruposping variáveis. Use a função facet_grid() para construir uma matriz de painéis, com a primeira variável distribuída ao longo das linhas e a segunda ao longo das colunas:

ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point(aes(color = factor(cyl))) +
    facet_grid(am ~ gear) +
    theme_classic()

Facetas ou cores? A cor funciona bem até cerca de quatro grupos em um gráfico com sobreposição limitada. Além disso, ou sempre que os grupos se sobrepõem muito, o facetamento é mais fácil de ler porque cada painel contém apenas seus próprios pontos. Você pode combinar ambos: facetamento por uma variável e cor por outra, como no exemplo facet_grid() acima.

Como lidar com sobreposição de pontos em gráficos de dispersão no R

Com algumas dezenas de observações, cada ponto é visível. Com milhares, os marcadores se sobrepõem e a região mais densa simplesmente aparece como uma mancha sólida. Isso é plotagem excessiva, e o ggplot2 oferece quatro soluções padrão.

1. Reduzir a opacidade. A solução mais barata. Sobreposição.ping Os pontos escurecem naturalmente, tornando a densidade visível:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    theme_classic()

2. Variação de valores discretos. Quando uma variável assume apenas alguns valores, os pontos coincidem em coordenadas idênticas. Um pequeno deslocamento aleatório os separa:

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
    geom_jitter(width = 0.15, height = 0) +
    theme_classic()

Defina a altura como 0 para que os valores de y, que contêm as informações reais, nunca sejam alterados.

3. Jogue o avião fora. Para conjuntos de dados grandes, conte as observações por célula e associe a contagem à cor. Os compartimentos hexagonais evitam os artefatos visuais produzidos pelos compartimentos quadrados.

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_hex(bins = 40) +
    theme_classic()

4. Desenhe as curvas de nível de densidade. As curvas de nível delimitam as regiões onde as observações se concentram e se sobrepõem perfeitamente aos pontos esmaecidos:

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    geom_density_2d(color = "#C42126") +
    theme_classic()

Como regra geral, o filtro alfa lida com alguns milhares de pontos, o agrupamento hexagonal lida com dezenas de milhares e, além disso, a amostragem dos dados com dplyr::slice_sample() é a opção pragmática.

Gráfico de dispersão em R: Code Referência

A tabela abaixo lista a chamada do ggplot2 para cada opção abordada acima:

Objetivo Code
Gráfico de dispersão básico
ggplot(df, aes(x = x1, y = y)) + geom_point()
Gráfico de dispersão com grupo de cores
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
Adicionar valores ajustados
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
Adicionar título
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
Adicionar legenda
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
Renomear x
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
Renomear você
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
Controle a balança
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1))
Criar registros
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
Tema
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
Faceta por um grupo
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
Lidar com sobreposição de gráficos
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
Economize
ggsave("my_fantastic_plot.png")

Perguntas Frequentes

A função `geom_point()` desenha cada observação em suas coordenadas exatas. A função `geom_jitter()` adiciona um pequeno deslocamento aleatório para que os pontos que compartilham o mesmo valor se tornem distinguíveis, o que é importante quando um eixo contém valores discretos.

Dentro de `aes()`, a cor mapeia uma variável, então o ggplot2 atribui uma tonalidade por nível e constrói uma legenda. Fora de `aes()`, a cor é uma constante fixa aplicada a cada ponto, e nenhuma legenda é exibida.

Adicione `stat_smooth(method = “lm”)` ou `geom_smooth(method = “lm”)` após `geom_point()`. Defina `se = FALSE` para ocultar a faixa de confiança e use `method = “loess”` para um suavizador não linear.

Os diagramas de dispersão revelam a correlação entre as características e os valores discrepantes antes do treinamento, e são a maneira padrão de exibir os valores previstos em comparação com os valores reais ou de visualizar os agrupamentos após a redução de dimensionalidade com PCA ou t-SNE.

Sim. Os assistentes de IA podem criar camadas, sugerir correções de sobreposição de gráficos e explicar erros como a falta de um wrapper aes(). Execute o código gerado em seus próprios dados, pois é fácil errar os nomes das colunas e os tipos dos fatores.

Resuma esta postagem com: