1. 钻石数据集
为了研究大数据集的分析工具,使用ggplot2内置的diamonds数据集,其中包含了约54000颗钻石的价格和质量的信息
这组数据涵盖了钻石的质量的四个“C”-克拉重量(carat)、切工(cut)、颜色(color)、净度(clarity),以及5个物理指标-深度(depth)、钻面宽度(table)、x、y和z
2. 展示数据分布
某些几何对象可以用于展示数据分布,具体使用哪种取决于分布的维度,变量是连续型还是离散型,以及我们感兴趣的是条件分布还是联合分布
对于一维连续型分布,最重要的几何对象是直方图,geom_histogram()
ggplot(diamonds, aes(depth)) +
geom_histogram()
ggplot(diamonds, aes(depth)) +
geom_histogram(binwidth = 0.1) +
xlim(55, 70)
为了找到一个表现力强的视图,布局时组距测试必不可少,依靠默认参数很难获取理想的效果。可以选择调整binwidth(组距宽度),设置bins(组数),或者精确指定breaks(切分位置)
第二幅图对x轴进行了放大:xlim(55, 70),并选取了一个更小的组距宽度:binwidth = 0.1,较第一幅图揭示出了更多细节
展示时别忘了在标题中表明重要参数(如组距宽度)的信息
如果需要比较各组数据的异同,则有以下选择
- 绘制多个小直方图 facet_wrap(~ var)
- 绘制频数多边图并以颜色作为分类, geom_freqpoly()
- 绘制**“条件密度图”**, geom_histogram(position = “fill”)
条件密度图应用position = fill填充各组,并将标度变换为相同高度。感受条件密度图想要表达的内容是具有挑战性的,因为需要比较条形的高度,而不是位置,但是可以看到最明显的模式
ggplot(diamonds, aes(depth)) +
geom_freqpoly(aes(color = cut), binwidth = 0.1, na.rm = TRUE) +
xlim(58, 68) +
theme(legend.position = "none")
ggplot(diamonds, aes(depth)) +
geom_histogram(aes(fill = cut), binwidth = 0.1, position = "fill", na.rm = TRUE) +
xlim(58, 68) +
theme(legend.position = "none")
作为几何对象的直方图和频数多边形均使用了stat = “bin” 统计变换。 此统计变换生成两个输出变量count和density
默认把变量count设为y轴,这样更便于解释。而变量density基本上等于各组频数除以总频数再乘以组距,此变量在我们想要比较不同分布的形状而不是数据的绝对大小时更有用
密度估计是分组可视化之外的另一选择。geom_density()对每一个数据点添上一点正态分布,然后把所有的曲线累加起来。它的理论性质比较理想,但却难以由图像追溯原始数据。请仅在已知潜在的密度分布为平滑、连续且无界的时候使用这种密度曲线图。可使用参数adjust来调整所得密度曲线的平滑曲线
ggplot(diamonds, aes(depth)) +
geom_density(na.rm = TRUE) +
xlim(58, 68) +
theme(legend.position = "none")
ggplot(diamonds, aes(depth, fill = cut, color = cut)) +
geom_density(alpha = 0.2, na.rm = TRUE) +
xlim(58, 68) +
theme(legend.position = "none")
请注意每一条密度曲线下的面积均已经过标准化为一,所以密度曲线图损失了有关各自己间相对大小的信息
直方图、频数多变图和密度曲线图均对单个数据分布作出了详细展示,但当需要在若干分布间作出比较时,牺牲一定数据质量而侧重数量就显得十分必要,为此,有以下三种选择
- geom_boxplot() :绘制箱线图,它展示分布的五个数据节点(上边缘、上四分位数、中位数、下四分位数、下边缘)和一个异常值。箱线图展示的信息远少于直方图,但它同时占用内存更少
箱线图x轴变量既可以时分类变量也可以是连续型变量。对于连续型变量,需要设置x轴的分组方式,可使用函数cut_width()
ggplot(diamond, aes(clarity, depth)) + geom_boxplot()
ggplot(diamonds, aes(carat, depth)) +
geom_boxplot(aes(group = cut_width(carat, 0.1))) +
xlim(NA, 2.05)
- geom_violin() :小提琴图是密度曲线图的精简版,基本运算方式相同,但结果通过与箱线图类似的形式展现
ggplot(diamonds, aes(clarity, depth)) + geom_violin()
ggplot(diamonds, aes(carat, depth)) +
geom_violin(aes(group = cut_width(carat, 0.1))) +
xlim(NA, 2.05)
- geom_dotplot() : 为每个观测值绘制点,经确调整避免重叠的同时展示数据分布,但通常仅用于偏小的数据集