此地古同

R小姐:让数据抖动起来

2018-11-05  本文已影响0人  鲨瓜

在绘制散点图时,我们有时会遇到数据量过大的麻烦。尤其在这个万物皆数据的时代。

由于数据量太大,而数据与数据之间的间隙又太小,使得数据之间相互层叠掩盖,这样就很难看出我们究竟有多少数据,以及数据之间的关系又是怎样的?

当然,我们可以通过改变数据点的大小来减少数据之间的层叠掩盖,但这样无疑使辨别哪个数据点的难度增加。

本文将介绍三种常用的方法解决数据量太大的问题:

1/2/3针对连续型数据,4针对离散型数据

1

原始数据展示

首先引入今天需要使用的包,ggplot2 和 gcookbook 就不做介绍了,ggplot2 将两张图整合到一起太麻烦,于是就利用 cowplot 将两张图整合到一起。hexbin 是用来画箱图的。

library(ggplot2)
library(gcookbook)
library(cowplot)
library(hexbin)

今天用的数据是钻石,家里有矿,共53940颗。

image

建立一个 p 对象,下文一直沿用。观察最最原始的数据集,可以看到数据与数据之间纷繁复杂的关系,相互层叠掩盖,看不出什么有价值的信息。

p <- ggplot(data = diamonds,aes(x=carat,y=price))
p1 <- p + geom_point() 
p1
image

2

半透明处理

针对上面的问题,我们首先利用第一种方法,更改数据点的透明度。

由于数据之间存在交叉层叠,交叉层叠越严重的区域数据点越多,颜色也就越深。这样我们就能初步判断出钻石品质的分布情况了。

本文将透明度分别设置为 0.1 和 0.01 。大家可以根据实际情况更改,直到出现符合预期的图像为止。plot_grid()将两张图整合到一起。

p2 <- p + geom_point(alpha=0.1)
p3 <- p + geom_point(alpha=0.01)
plot_grid(p2,p3,labels = c('p2','p3'))
image

由上图我们可以得出一些信息,图像左下方颜色比较深,表示数据点多,因此我们开采的钻石大部分品质较低,价格不是那么贵,高品质钻石很少。

3

几何图形分割

图形分割的原理与改变透明度差不多,图形分割是将整个图形分成若干个区域。

例如 bin=50 时,X轴分成50份,Y轴分成50份,这样X轴和Y轴内的区域就被分成2500个小矩形,每个矩形的数据点数是涂色的依据,矩形内的数据点越多,颜色越深。

p4 <- p + stat_bin2d()
p5 <- p + stat_bin2d(bins = 50) +
  scale_fill_gradient(low = 'lightblue',high = 'red',limits=c(0,6000))
plot_grid(p4,p5,labels = c('p4','p5'))
image

与半透明处理的结论是一致的,但这样可能更直观一些。

接下来看一下,正六边形分割的效果,正六边形的面积更大,包裹的数据点更多。

p6 <- p + stat_binhex() +
  scale_fill_gradient(low = 'lightblue',high = 'red',
                      limits=c(0,8000),
                      guide = guide_legend())
p7 <- p + stat_binhex() +
  scale_fill_gradient(low = 'lightblue',high = 'red',
                      breaks=c(0,250,500,1000,2000,4000,6000),
                      limits=c(0,6000),
                      guide = guide_legend()) 
plot_grid(p6,p7,labels = c('p6','p7'))
image

还不错,挺好看的。

4

箱图

除了上边的比较连续的数据,我们有时也会处理一些离散型数据。离散型数据的特征是一行一行的掩盖,或者是一列一列的掩盖。

image

针对这个特点,我们可以让数据抖一抖,使他们彼此分开。抖动 jitter

sp1未处理,sp2是默认抖动,sp3自定义抖动

sp1 <- sp + geom_point()
sp2 <- sp + geom_point(position = 'jitter')
sp3 <- sp + geom_point(position = position_jitter(width = .5,height = 0))
plot_grid(sp1,sp2,sp3,labels = c('sp1','sp2','sp3'),ncol = 3)
image

有图有真相,离散型数据 sp1数据之间掩盖,sp2、sp3分离效果还可以。

我们也可以利用箱图。

box1 <- sp + geom_boxplot()
box2 <- sp + geom_boxplot(aes(group=Time))
plot_grid(box1,box2,labels = c('box1','box2'))
image

box1没有指定分组依据,所以将所有点都算到一块了,box2中我们指定分组依据Time,效果马上就显现了。

箱图能向我们展示了哪些信息呢?有点累了,下次再详细说吧!


由于文章篇幅有限,很多函数的具体功能及参数没办法向大家详细介绍。建议大家多多看英文官方文档,自行理解。

下期再见。

你可能还想看

等你很久啦,长按加入古同社区

image
上一篇下一篇

猜你喜欢

热点阅读