scatterplotMatrix与组直方图

时间:2014-01-12 22:15:25

标签: r plot histogram

如下所示,很容易构建一个漂亮的大型散点图矩阵,其中包含对角线下方的多元数据,如下所示:

scatterplotMatrix(somedata[1:points.count,],groups=somedata[1:points.count,class],
                by.groups=TRUE,diagonal="histogram")

根据文档,似乎不可能像this question中那样按组标签划分直方图。你会怎样使用scatterplotMatrix或类似的函数?

2 个答案:

答案 0 :(得分:2)

这是你的想法吗?

使用虹膜数据集:

library(ggplot2)
library(data.table)
library(reshape2)  # for melt(...)
library(plyr)      # for .(...)

xx <- with(iris, data.table(id=1:nrow(iris), group=Species, 
           Sepal.Length, Sepal.Width,Petal.Length, Petal.Width))
# reshape for facetting with ggplot
yy <- melt(xx,id=1:2, variable.name="H", value.name="xval")
yy <- data.table(yy,key="id,group")
ww <- yy[,list(V=H,yval=xval),key="id,group"]
zz <- yy[ww,allow.cartesian=T]
setkey(zz,H,V,group)
zz <- zz[,list(id, group, xval, yval, min.x=min(xval), min.y=min(yval),
               range.x=diff(range(xval)),range.y=diff(range(yval))),by="H,V"]
# points colored by group (=species)
# density plots for each variable by group
d  <-  zz[H==V, list(x=density(xval)$x,
          y=mean(min.y)+mean(range.y)*density(xval)$y/max(density(xval)$y)),
          by="H,V,group"]
ggp = ggplot(zz)
ggp = ggp + geom_point(subset  =.(H!=V), 
                       aes(x=xval, y=yval, color=factor(group)), 
                       size=3, alpha=0.5)
ggp = ggp + geom_line(subset = .(H==V), data=d, aes(x=x, y=y, color=factor(group)))
ggp = ggp + facet_grid(V~H, scales="free")
ggp = ggp + scale_color_discrete(name="Species")
ggp = ggp + labs(x="", y="")
ggp

我一直听说在GGally包中使用ggpairs(...)可以做同样的事情。我很想看到一个真实的例子。文档是不可思议的。此外,ggpairs(...)非常慢(在我手中),特别是对于大型数据集。

答案 1 :(得分:1)

供以后参考,GGally的方法如下:

require(ggpairs)
tmp <- data.table(a = runif(30),b = runif(30), c = runif(30)+1, 
                  d = as.factor(sample(0:1,size=30, replace=TRUE)))

ggpairs(data=tmp, diag=list(continuous="density"), columns=1:3, colour="d",
        axisLabels="show")

pairwise scatterplot matrix with group densities on diagonal

This intrepid asker发现你必须启用有点傻的axisLabels,考虑到ggplot和朋友的美学重点。

现在我想知道如何并行化这个,因为它是一个有大量变量的怪物。