展示数据分布
- Part 1
- Part 1.1
- 调整组距
- Part 1.2
- 调整组距+分面(密度)
- 累积直方图
- 频率多边形
- Part 2
- 箱线图
- 分箱
- 抖动型散点图 jitter
- 密度图(基于核平滑方法进行平滑后得到的频率多边形)
有一些几何对象可以用于展示数据的分布,具体使用哪种取决于分布的维度、分布是连续型或是离散型,以及我们感兴趣的是条件分布还是联合分布。对于一维连续型分布,最重要的几何对象是直方图。下图使用直方图展示了
diamond数据中的
depth变量。为了找到一个表现力强的视图,多次测试组距的布局细节是必不可少的。例如,我们可以改变组距宽度(
binwidth
)或者显式地精确指定切分位置(
breaks
)。
以下代码演示了这些方式:
Part 1
Part 1.1
调整组距
永远不要指望依靠默认的参数就能对某个具体的分布获得一个表现力强的图形(左上图)。
(下图) 对 x 轴进行了放大,xlim = c(55,70)
,并选取了一个更小的组距宽度, binwidth =0.1
,较左图揭示出了更多细节。我们可以发现这个分布是轻度右偏的。
同时别忘了在标题中写上重要参数 (如组距宽度) 的信息。
qplot(depth, data = diamonds, geom = "histogram")
qplot(depth, data = diamonds, geom = "histogram", xlim = c(55, 70), binwidth = 0.1)
Part 1.2
有多种方式可以用来进行分布的跨组比较:同时绘制多个小的直方图,facets=.-var
;使用频率多边形(frequency polygon),geom="freqpoly"
;或者使用条件密度图,position="fill"
。
作为几何对象的直方图和频率多边形均使用了stat_bin
统计变换。此统计变换生成了两个输出变量count
和density
。变量count
为默认值,因为它的可解释性更好。而变量density
基本上相当于count除以count的总数,此变量在我们想要比较不同分布的形状而不是数据的绝对大小时更有用。特别地,我们经常使用此变量来比较数据中不同大小子集的分布。
和分布相关的许多几何对象都是以几何对象(geom)/统计变换(stat)的形式成对出现的。这些几何对象中大多数的本质都是别名(alias):一个基本几何对象结合一个统计变换,即可绘制出想要的图形。表面上看,箱线图(boxplot)
似乎是一个例外,但在幕后实现上,geom_boxplot
同样是使用基本的条、线和点组合而成的。
钻石数据切割和深度分布的三种视图。从上至下分别是分面直方图、条件密度图和频率多边形图。
调整组距+分面(密度)
depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58, 68)
它们都显示了出一个有趣的模式:随着钻石质量的提高,分布逐渐向左偏移且愈发对称。
depth_dist + geom_histogram(aes(y = ..density..), binwidth = 0.1) + facet_grid(cut~.)
累积直方图
depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill")
频率多边形
depth_dist + geom_freqpoly(aes(y = ..density.., colour = cut), binwidth = 0.1)
Part 2
箱线图可以用于观察针对一个类别型变量 (如 cut) 取条件时(上图),或连续型变量 (如 carat) 取条件时(下图),连续型变量的分布情况。
library(plyr)
箱线图
qplot(cut, depth, data = diamonds, geom = "boxplot")
分箱
对于连续型变量,必须设置group
图形属性以得到多个箱线图。
此处使用了group=round_any(carat,0.1, floor)
来获得针对变量carat以0.1个单位为大小分箱后的箱线图。
qplot(carat, depth, data = diamonds, geom = "boxplot",
group = round_any(carat,0.1, floor), xlim = c(0, 3))
抖动型散点图 jitter
几何对象jitter
可在二维分布中有一个离散型变量时绘制出一个较为粗略的图形。
总体来说,这种数据打散的处理对小数据集更有效。
上图展示了mpg数据集中离散型变量class和连续型变量city,下图则将连续型变量city替换为离散型变量drv。
geom_jitter=position_jitter+geom_point
:通过在离散型分布上添加随机噪声以避免遮盖绘制问题,这是一种较为粗糙的方法。使用以下代码绘制的图展示了这样的一个例子。
qplot(class, cty, data = mpg, geom = "jitter")
qplot(class, drv, data = mpg, geom = "jitter")
密度图(基于核平滑方法进行平滑后得到的频率多边形)
geom_density=stat_density+geom_area
:基于核平滑方法进行平滑后得到的频率多边形。请仅在已知潜在的密度分布为平滑、连续且无界的时候使用这种密度图。可以使用参数adjust
来调整所得密度曲线的平滑程度。使用以下代码绘制的图展示了这样一个例子。
密度图实际上就是直方图的平滑化版本。它的理论性质比较理想,但难以由图回溯到数据本身。
上图为变量depth的密度图。下图为按照变量cut的不同取值上色的版本。
qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70))
qplot(depth, data = diamonds, geom = "density", xlim = c(54, 70), fill = cut,alpha = I(0.2))