R小姐:让数据抖动起来
在绘制散点图时,我们有时会遇到数据量过大的麻烦。尤其在这个万物皆数据的时代。
由于数据量太大,而数据与数据之间的间隙又太小,使得数据之间相互层叠掩盖,这样就很难看出我们究竟有多少数据,以及数据之间的关系又是怎样的?
当然,我们可以通过改变数据点的大小来减少数据之间的层叠掩盖,但这样无疑使辨别哪个数据点的难度增加。
本文将介绍三种常用的方法解决数据量太大的问题:
-
利用 alpha 改变数据的透明度
-
利用矩形分割数据或者利用正六边形分割数据
-
利用箱图
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