ggplot2에서 산점도 행렬 (pairs () 등가물) 만들기


117

ggplot2사용하여 산점도 행렬을 그릴 수 있습니까?ggplot추가 요소를 색상, 모양 등에 매핑하고 더 매끄럽게 추가하는 것과 같은의 멋진 기능을 있습니까?

base함수 와 비슷한 것을 생각하고 있습니다 pairs.


17
또한 ggally 체크 아웃
해들리

1
아, 거기에서 당신의 의견을 보지 못했습니다. 내가 만든 도용되지 않도록 내 대답 CW 당신의 CRED :
naught101

답변:


37

plotmatrix를 사용해 볼 수 있습니다.

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

나에게 mpg (mtcars의 첫 번째 열)는 요소가되어서는 안됩니다. 나는 그것을 확인하지 않았지만 그것이 하나 여야 할 이유가 없습니다. 그러나 나는 산점도를 얻습니다 :)


참고 : 향후 참조를 위해 @ naught101 이이 질문에 대한 다른 응답에서 제안한대로이 함수는 패키지 plotmatrix()ggpairs()함수 로 대체되었습니다 .GGally


이 문제를 해결하기 위해 패싯을 얻을 수 없었습니다. 공식의 오른쪽에 요소가 필요한 것 같습니다. 아니면 최소한의 예를 들어 주시겠습니까?
Karsten W.

1
누구든지 색상을 추가하는 방법을 알고 있습니까? 이 gist.github.com/1405150 을 작동 시킬 수없는 것 같습니다.
Etienne Low-

1
이 답변의 첫 번째 부분은 잘못되었으며 혼란을 야기합니다. 패싯을 사용하여 쌍 플롯을 수행 할 수 없습니다. y x x 플롯 만 수행하고 요인별로 그룹화 할 수 있습니다. 즉, 패싯을 사용하면 각 하위 플롯에 동일한 x와 y가 있습니다. 쌍을 사용하면 각 열에 다른 x가 있고 각 행에 다른 y가 있습니다.
naught101

28
향후 참조를 위해 @ naught101이이 질문에 대한 또 다른 응답에서 제안한대로이 함수는 패키지 plotmatrix()ggpairs()함수 로 대체되었습니다 GGally.
smillig

1
@MattBannert가 게시물을 더 잘 보이게하기 위해 게시물에 댓글을 추가했습니다. 댓글을 읽지 않았다면 반대 투표자를 이해할 수있었습니다. 괜찮 으시길 바랍니다.
zx8754

232

나는 이것을 계속하고 싶지만, plotmatrix는 쓰레기입니다. Hadley 대신 GGally 패키지 를 사용할 것을 권장 합니다. 여기에는 크게 개선 된 쌍 플롯 인 ggpairs 라는 함수 가 있습니다 (데이터 프레임에서 비 연속 변수를 사용할 수 있음). 변수 유형에 따라 각 사각형에 다른 플롯을 표시합니다.

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

여기에 이미지 설명 입력


26
이것은 정말 대단합니다. 어떤 colour변수도 요인이되어야 한다는 점은 주목할 가치가 있습니다. 그것을 알아내는 데 45 분을 보냈습니다.
gregmacfarlane

1
쌍없이 이러한 상관 행렬을 플로팅하는 방법이 있습니까? 예를 들어 첫 번째 열과 다른 모든 열을 플로팅해야합니다 .ggpairs는 매우 가능한 쌍을 제공합니다. 첫 번째 열과 다른 9 개만 필요
Rgeek

1
@Rgeek : melt관심있는 변수를 id 변수로 사용하여 데이터 프레임을 만든 다음 다른 변수로 패싯 할 수 있습니다.
naught101

6
ggpairs를 사용하지 말고 ggplot2를 정상적으로 사용하십시오 ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). 나는 당신이 "상관 플롯"이라고 말할 때 산점도에 대해 이야기하고 있다고 가정하고 있습니다. 왜냐하면 다른 방법으로는 들어 본 적이 없기 때문입니다.
naught101

3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP

17

ggplot객체 를 얻으려면 (의 ggmatrix경우가 ggpairs()아님) 데이터를 두 번 ggplot녹인 다음 패싯 을 사용하는 것이 해결책입니다. 매개 변수가 제공 되면 플롯 된 영역을 제한하는 facet_wrap것보다 낫습니다 .facet_gridscales = 'free'

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')
}

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.