第五章 变量间关系可视化
1 解释原始数据
1.1 mtcars
mtcars是R自带的数据集,该数据集摘自 1974年《美国汽车趋势》杂志,包括32款汽车(1973~74款)的油耗、汽车设计和性能等共11个指标。根据该数据集绘制本次练习图形。
指标解释:cyl、vs、am、gear和carb作为因子变量,其余可看作数值变量。
mpg: 燃油效率(英里/加仑),数值越高越省油。
cyl: 发动机气缸数(4/6/8缸),缸数越多通常动力越强。
disp: 发动机排量(立方英寸),排量越大动力越强,油耗越高。
hp: 发动机马力(马力),数值越高动力越强。
drat: 后轴传动比(比值),影响加速和燃油经济性。
wt: 车重(千磅),重量轻的车通常更省油。
qsec: 1/4英里加速时间(秒),时间越短动力越强。
vs: 发动机类型(0=V型,1=直列),V型多见于高性能车。
am: 变速器类型(0=自动,1=手动),手动挡通常更省油。
gear: 前进挡位数(3/4/5挡),挡位多可能更平顺省油。
carb: 化油器数量(1-8个),数量多可能提升动力。
1.2 diamonds
diamonds是R中ggplot2包内置的经典数据集,记录了约 54,000 颗钻石的物理属性和价格信息。数据集包含 10 个变量,4个分类变量,6个数值变量。
- 指标解释:cut、color、clarity为因子变量,其余可看作数值变量。
- carat: 钻石重量,单位是克拉(1克拉=0.2克),数值越大钻石越大越贵。
- cut: 切工质量,分为5个等级:Fair(一般)、Good(良好)、Very Good(很好)、Premium(优质)、Ideal(完美),切工越好钻石光泽越强。
- color: 颜色等级,从D(无色,最佳)到J(浅黄色),颜色越接近无色价值越高。
- clarity: 净度等级,分为8级:I1(内含物明显)、SI1-SI2(小内含物)、VS1-VS2(极小内含物)、VVS1-VVS2(极微小内含物)、IF(内部无瑕),净度越高钻石越纯净。
- depth: 总深度百分比(%),计算公式为z/(x+y)/2*100,影响钻石的光反射效果。
- table: 台面宽度百分比(%),指钻石顶部平面相对于平均宽度的比例,影响钻石的外观比例。
- x: 钻石长度(毫米),物理尺寸之一。
- y: 钻石宽度(毫米),物理尺寸之一。
- z: 钻石高度(毫米),物理尺寸之一。
- price: 钻石价格(美元),反映其综合价值,受carat、cut、color、clarity等因素影响。
2 两变量散点图
2.1 绘图要求
利用
ggplot(data,aes(x,y))+geom_point()绘制燃油效率(mpg,横轴)和车重(wt,纵轴)两个变量的散点图;利用
geom_rug()为横轴和纵轴绘制地毯图;利用
stat_smooth()为散点图添加拟合直线;利用
geom_point()为散点图添加均值点;利用
ggMarginal(type="densigram")为散点图添加边际核密度直方图;利用
ggtitle()将图标题改为散点图+地毯图+线性拟合+边际图。
2.2 作图代码
2.3 图形观察和代码编写的心得体会
mpg的均值20,wt的均值为3.4,数据主要聚集在均值附近。mpg跟wt的关系是负相关。
注意这个画边际图形,是要将整个图的内容传给ggMarginal这个函数当做第一个参数,管道符号是ctrl + shift + M,x轴的直方图是mpg的,y轴的直方图是wt的。
mpg代表燃油效率,wt代表车重。车子越轻,则燃油效率越高。
3 散点图矩阵和相关系数矩阵图
3.1 绘图要求
利用
GGally::ggpairs(columns)绘制除cyl、vs、am、gear和carb外6个变量的散点图矩阵;修改参数
upper=list(continuous = "density"),将上三角图形改为二维核密度等高线图;利用
ggiraphExtra::ggCor()绘制除cyl、vs、am、gear和carb外6个变量的相关系数矩阵图。
3.2 散点图矩阵
3.3 相关系数矩阵图代码
3.4 图形观察和代码编写的心得体会
mpg: 燃油效率(英里/加仑),数值越高越省油。
disp: 发动机排量(立方英寸),排量越大动力越强,油耗越高。
hp: 发动机马力(马力),数值越高动力越强。
drat: 后轴传动比(比值),影响加速和燃油经济性。
wt: 车重(千磅),重量轻的车通常更省油。
qsec: 1/4英里加速时间(秒),时间越短动力越强。
由图可知disp和wt,disp和hp,mpg和drat,hp和wt具有较强的正相关。而disp和mpg,wt和mpg,hp和mpg,drat和disp,wt和drat具有较强的负相关。比较符合现实的情况
理解等高线图的基本概念:
等高线:等高线是连接具有相同密度值的点的线。在二维核密度等高线图中,等高线表示数据点在该区域的密度。
密度估计:密度估计是一种统计方法,用于估计数据点在空间中的分布情况。核密度估计是一种非参数密度估计方法,它通过核函数对数据进行平滑处理,以估计数据点的概率密度。
核函数:核函数是核密度估计中的关键部分,它决定了数据点周围区域的权重。常用的核函数包括高斯核、均匀核等。
读取等高线图:
等高线的疏密程度:等高线越密集的区域,表示数据点在该区域的密度越高。相反,等高线越稀疏的区域,表示数据点在该区域的密度越低。
等高线的高度值:等高线的高度值通常表示数据点的密度。高度值越高,表示数据点在该区域的密度越大。在某些图形中,高度值可能通过颜色或标签来明确表示。
颜色变化:在彩色等高线图中,颜色变化通常用于表示密度的高低。例如,暖色调(如红色)可能表示高密度区域,而冷色调(如蓝色)可能表示低密度区域。
结合散点图矩阵进行综合分析:
观察变量之间的关系:通过散点图矩阵中的散点图,可以直观地了解变量之间的线性或非线性关系。结合上三角的等高线图,可以进一步了解变量之间的分布情况。
识别数据点的集中区域:在等高线图中,高密度区域表示数据点在该区域的集中程度。这有助于我们识别数据中的主要模式或趋势。
发现异常值或离群点:在等高线图中,低密度区域可能表示数据点在该区域的分布较为稀疏。这有助于我们发现异常值或离群点。
等高线图的应用和局限性:
应用:等高线图在数据分析中广泛应用于展示数据点的分布情况、识别数据中的模式和趋势,以及发现异常值或离群点。
局限性:等高线图可能受到数据量、核函数选择等因素的影响。在数据量较小或核函数选择不当的情况下,等高线图可能无法准确地反映数据的真实分布情况。1
4 大数据集的散点图
4.1 绘图要求
利用
diamonds数据,绘制carat: 钻石重量和price: 钻石价格两个变量的散点图;利用geom_hex(bins=30,size=0.3,color="black"),将散点图转化为六边形分箱散点图;利用
stat_density_2d(geom="raster",aes(fill=..density..),contour=FALSE),将散点图转化为二维核密度图;利用
geom_density_2d(),在散点图上添加核密度等高线;利用
geom_density_2d_filled(alpha=0.8),对核密度等高线区域填充颜色。
4.2 六边形分箱散点图
4.3 二维核密度图
4.4 散点图+密度等高线
4.5 散点图+密度等高线带
4.6 图形观察和代码编写的心得体会
在克拉较小时,例如不超过1克拉时,克拉跟价格是成正比的关系。而当克拉较大时,两者的价格没有规律性可言。
当加上密度曲线图可以清楚看到价格跟克拉的关系,且图形较为美观。
图表解读:
六边形分箱散点图
六边形分箱: 这种图表将整个数据空间划分为许多六边形的小格子(bins)。每个六边形内的点的数量决定了该六边形的颜色深浅。
数据密度可视化: 六边形分箱散点图非常适合展示大量数据点的分布情况,尤其是当数据点重叠严重,传统的散点图难以清晰展示时。它能有效地反映数据在不同区域的密度。
与您的观察一致: 在克拉较小(carat 值较小)的区域,您会看到六边形颜色逐渐变深,这表示随着克拉的增加,价格也倾向于增加,即正相关关系。而在克拉较大的区域,六边形的颜色变化可能不那么规则,甚至出现颜色深浅不一的情况,这表明克拉与价格之间的关系变得不那么明确,与您的观察“当克拉较大时,两者的价格没有规律性可言”一致。
代码心得:
geom_hex(bins=30, size=0.3, color="black"):bins=30控制了六边形的数量,数值越大,六边形越小,能展示更细致的密度变化,但也可能使图表显得更杂乱。size=0.3控制了六边形边框的粗细,color="black"设置了边框颜色。scale_fill_viridis_c(option="H"): 使用了viridis配色方案中的 “H” 选项,这是一种对色盲友好的配色方案,能更好地保证颜色在不同人群中的可区分性。
4.6.1 2. 二维核密度图 (2D Kernel Density Plot)
图表解读:
核密度估计: 二维核密度图通过平滑的等高线或颜色渐变来估计数据点的分布密度。它想象在每个数据点位置放置一个核函数(比如高斯核),然后将所有这些核函数叠加起来,得到整个数据空间的密度估计。
密度可视化: 颜色越深(或越亮)的区域,表示数据点在该区域的密度越高。等高线则连接了密度值相等的点,形成了密度轮廓。
与您的观察一致: 在克拉较小的区域,您会看到颜色较深(或较亮)的区域沿着一条从左下到右上的方向延伸,这直观地展示了克拉与价格的正相关关系。在克拉较大的区域,颜色变化可能更加复杂,甚至出现多个密度峰值,表明价格分布更加分散,与您的观察一致。
代码心得:
stat_density_2d(geom="raster", aes(fill=..density..), contour=FALSE):geom="raster"表示使用栅格化的方式来绘制密度图,这比等高线图更平滑。aes(fill=..density..)表示用密度值来映射填充颜色。contour=FALSE表示不绘制等高线。scale_fill_viridis_c(option="H"): 同样使用了viridis配色方案。
4.6.2 3. 散点图 + 密度等高线 (Scatter Plot + Density Contours)
图表解读:
双重信息展示: 这种图表结合了传统的散点图和二维核密度图的优点。散点图展示了每个数据点的位置,而密度等高线则勾勒出了数据分布的密度轮廓。
增强可读性: 密度等高线可以帮助您更清晰地看到数据分布的整体趋势,尤其是在数据点重叠较多的区域。
与您的观察一致: 散点图展示了数据点的具体分布,而密度等高线则强化了克拉与价格的正相关关系,尤其是在克拉较小的区域,等高线可能更加密集和闭合,表明数据点在该区域更加集中。
代码心得:
geom_point(color="grey20"): 绘制了灰色的散点图,color="grey20"设置了散点的颜色。geom_density_2d(): 添加了二维核密度等高线,默认情况下,它会使用与stat_density_2d()相同的密度估计方法。
4.6.3 4. 散点图 + 密度等高线带 (Scatter Plot + Density Contour Bands)
图表解读:
密度区域填充: 这种图表在散点图的基础上,不仅添加了密度等高线,还对等高线之间的区域进行了颜色填充,形成了密度等高线带。
更直观的密度对比: 颜色填充可以更直观地比较不同密度区域,使您更容易识别数据分布的高密度区域和低密度区域。
与您的观察一致: 密度等高线带进一步强化了克拉与价格的正相关关系,尤其是在克拉较小的区域,您会看到颜色较深的等高线带,表明数据点在该区域更加密集。
代码心得:
geom_density_2d_filled(alpha=0.8): 添加了填充颜色的二维核密度等高线带,alpha=0.8控制了填充颜色的透明度,使散点图仍然可见。geom_density_2d(size=0.25, colour="black"): 再次添加了二维核密度等高线,但这次设置了更细的线宽 (size=0.25) 和黑色 (colour="black") 的线条颜色,可能是为了突出等高线的轮廓。guides(fill="none"): 移除了填充颜色的图例,因为密度等高线带主要是为了视觉增强,而不是为了精确的密度值展示。
4.6.4 图形观察和代码编写的心得体会总结
数据分布的直观展示: 这些图表都有效地展示了钻石重量(carat)与价格(price)之间的关系。通过不同的可视化方法,您可以更全面地理解数据的分布特征和变量之间的关系。
图表类型的选择: 不同的图表类型适用于不同的场景。六边形分箱散点图适合快速概览数据分布,二维核密度图适合平滑展示密度变化,散点图叠加密度等高线或等高线带则适合同时展示数据点和密度轮廓。
代码的可重复性和可调整性: 您提供的代码非常清晰且易于修改。通过调整
geom_hex()的bins参数,stat_density_2d()的geom和contour参数,以及geom_density_2d()和geom_density_2d_filled()的样式参数,您可以轻松地探索不同的可视化效果,并根据您的需求调整图表的外观。配色方案的重要性: 选择合适的配色方案对于图表的清晰度和可读性至关重要。
viridis配色方案是一个很好的选择,因为它对色盲友好,且在不同媒介上都能保持良好的可视性。
5 3D散点图和气泡图
5.1 绘图要求
绘制hp发动机马力、mpg燃油效率和wt车重三个变量的 3D 散点图和气泡图。
采用
scatterplot3d(x=hp,y=wt,z=mpg)绘制3D散点图,并添加回归平面。采用
ggplot(df,aes(x=hp,y=mpg,color=wt,size=wt))绘制气泡图
5.2 3D散点图代码
5.3 气泡图代码
5.4 图形观察和代码编写的心得体会
type=“p”使得数据是以散点的形式存在,type=“h”使得数据以线段的形式存在
box=FALSE控制3D散点图的框
利用气泡图较为直观地反应三变量地关系,hp发动机马力越大,mpg燃油效率就越低。wt车重越重,mpg越低。hp和wt的线性关系并不强
6 分组散点图
6.1 绘图要求
以气缸数(cy1)为因子,绘制车重(wt)和燃油效率(mpg)的分组散点图,添加回归直线;
利用
facet_grid(~cy1,scale="free_x"),按因子变量分面;利用
ggplot(data=df,aes(x=wt,y=mpg,shape=cyl,color=cyl)),按形状和颜色分组
6.2 按因子变量分面代码
- 注意分组变量cyl需要转化为因子
6.3 按形状和颜色分组代码
6.4 图形观察和代码编写的心得体会
先画出散点图,再加上facet_grid(~cyl,scale=“free_x”)就可以按照因子变量进行分面了。不过注意要先将分类变量因子化。mutate(cyl=factor(cyl))
shape=11,可更改点的形状