在ggplot2中创建散点图矩阵(对等对)


117

是否可以使用绘制好散布图矩阵,并ggplot2使用ggplot的一些不错的功能,例如将其他因子映射到颜色,形状等,并增加平滑度?

我在想类似base功能的东西pairs


17
还请检查出问题
hadley 2010年

1
啊,在哈德利那里我没看到你的评论。我做了我的回答,以免窃取您的信誉:)
naught101

Answers:


37

您可能想尝试一下plotmatrix:

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

对我而言,mpg(mtcars的第一列)不应成为一个因素。我没有检查它,但是没有理由为什么它应该是一个。但是我得到了一个散点图:)


注意:plotmatrix()函数已由软件包中的ggpairs()函数替换,以供将来参考,GGally如@ naught101 在下面对该问题的另一个答复中建议的那样。


我无法解决这个问题,似乎它需要公式右边的因素。或者您能给我一个最小的例子吗?
Karsten W.

1
有人知道如何添加颜色吗?我似乎无法使该gist.github.com/1405150正常工作
-Décarie

1
该答案的第一部分是错误的,并引起混乱。您无法使用图面对图进行配对:只能通过x图进行y运算,并按因子进行分组。换句话说,使用分面时,每个子图上的x和y都相同;配对时,每一列都有一个不同的x,而每一行都有一个不同的y。
naught101

28
供将来参考,该plotmatrix()函数已由包中的ggpairs()函数替换,GGally如@ naught101在对该问题的另一种回答中所建议的。
smillig

1
@MattBannert在您的帖子中添加了评论,以使其更加可见,如果跳过阅读评论,我可以理解那些投反对票的人。希望你不要介意。
zx8754

232

我一直想这样做,但plotmatrix很烂。Hadley 建议改用GGally软件包。它具有ggpairs函数,这是一个大大改进的对图(让您在数据帧中使用非连续变量)。它根据变量类型在每个正方形中绘制不同的图:

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

在此处输入图片说明


26
真的很棒 值得注意的是,任何colour变量都必须是一个因素。花了45分钟弄清楚那一个。
gregmacfarlane

1
有没有办法绘制没有对的这些相关矩阵?例如,我需要绘制第一列与其他列的关系。想要第一列与其他仅9列
Rgeek

1
@Rgeek:您可以melt将您感兴趣的变量用作id变量,然后再由其他变量作为方面。
naught101 2015年

6
不要使用ggpairs,只需正常使用ggplot2即可,例如ggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable)。我假设您所说的“相关图”是在谈论散点图,因为我从未听说过。
naught101 2015年

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

17

如果要获取一个ggplot对象(不是ggmatrix的情况ggpairs()),解决方案是将数据融化两次,然后ggplot进行分面。给定参数,facet_wrap将比facet_grid限制绘制区域更好scales = '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')
}

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.