Crie uma matriz de gráficos de dispersão (pares () equivalentes) em ggplot2

117

É possível traçar uma matriz de gráficos de dispersão com ggplot2, usando ggplotos recursos interessantes de, como mapear fatores adicionais para cor, forma, etc. e adicionar mais suavidade?

Estou pensando em algo semelhante à basefunção pairs.

Karsten W.
fonte
17
Verifique também ggally
hadley de
1
Ah, eu não vi seu comentário lá hadley. Eu fiz minha resposta CW para não roubar sua credibilidade :)
naught101

Respostas:

37

Você pode querer experimentar o plotmatrix:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

para mim, mpg (primeira coluna em mtcars) não deve ser um fator. Eu não verifiquei, mas não há razão para que seja. No entanto, recebo um gráfico de dispersão :)


Nota: Para referência futura, a plotmatrix()função foi substituída pela ggpairs()função do GGallypacote como @ naught101 sugere em outra resposta abaixo a esta pergunta.

Matt Bannert
fonte
Não consegui fazer a lapidação trabalhar neste problema, parece que requer fatores do lado direito da fórmula. Ou você poderia me dar um exemplo mínimo?
Karsten W.
1
Alguém sabe adicionar cor? Não consigo fazer com que gist.github.com/1405150 funcione
Etienne Low-Décarie
1
A primeira parte desta resposta está errada e causa confusão. Você não pode fazer gráficos de pares com facetação: você só pode fazer gráficos de y por x, e agrupá-los por fatores. Em outras palavras, com o facetamento você tem o mesmo xey em cada subtrama; com pares, você tem um x diferente em cada coluna e um y diferente em cada linha.
naught101
28
Para referência futura, a plotmatrix()função foi substituída pela ggpairs()função do GGallypacote como @ naught101 sugere em outra resposta a esta questão.
smillig
1
@MattBannert adicionou o comentário ao seu post para torná-lo mais visível, eu poderia entender os downvoters se tivesse pulado a leitura dos comentários. Espero que você não se importe.
zx8754
232

Eu continuo querendo fazer isso, mas plotmatrix é uma porcaria. Hadley recomenda usar o pacote GGally . Ele tem uma função, ggpairs , que é um gráfico de pares amplamente aprimorado (permite que você use variáveis ​​não contínuas em seus quadros de dados). Ele traça gráficos diferentes em cada quadrado, dependendo dos tipos de variáveis:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

insira a descrição da imagem aqui

naught101
fonte
26
Isso é realmente ótimo. É importante notar que qualquer colourvariável deve ser um fator; passou 45 minutos descobrindo isso.
gregmacfarlane
1
Existe alguma maneira de plotar essas matrizes de correlação sem pares? Por exemplo, eu preciso plotar a primeira coluna contra todas as outras colunas. Pares dá um par muito possível. Por exemplo, eu tenho 10 colunas e isso me dá 10 * 10 = 100. Mas eu deseja a 1ª coluna vs outras 9 apenas
Rgeek
1
@Rgeek: você pode meltcriar o dataframe usando a variável de seu interesse como uma variável de id e, em seguida, facetá-la pelas outras variáveis.
naught101
6
Não use ggpairs, apenas use ggplot2 normalmente, como ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). Presumo que você esteja falando sobre gráficos de dispersão quando diz "gráfico de correlação", porque de outra forma nunca ouvi falar nisso.
naught101
3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP
17

Se se deseja obter um ggplotobjeto (não ggmatrixcomo no caso de ggpairs()), a solução é fundir os dados duas vezes, depois ggplotcom facetação. facet_wrapseria melhor do que facet_gridlimitar a área traçada, dado o scales = 'free'parâmetro é fornecido.

require(ggplot2) 
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)
}

iris %>% 
  gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) +
      geom_point() + 
      geom_smooth(method = 'lm') +
      facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) +
      scale_color_brewer(type = 'qual')
}

insira a descrição da imagem aqui

mjktfw
fonte