第五章 变量间关系可视化

Author

221527115杨诗婷

1 解释原始数据

1.1 mtcars

  • mtcars 是R自带的数据集,该数据集摘自 1974年《美国汽车趋势》杂志,包括32款汽车(1973~74款)的油耗、汽车设计和性能等共11个指标。根据该数据集绘制本次练习图形。
data = mtcars
datatable(data)
  • 指标解释: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

  • diamondsRggplot2包内置的经典数据集,记录了约 54,000 颗钻石的物理属性和价格信息。数据集包含 10 个变量,4个分类变量,6个数值变量。
bigdata = diamonds
datatable(head(bigdata,12))
  • 指标解释: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 作图代码

df <- data

p1<-ggplot(data=df,aes(x=mpg,y=wt))+
    geom_point(shape=21,size=1.5,fill="deepskyblue")+  # 设置点的形状、大小和填充颜色
    geom_rug(color="steelblue")+               # 添加地毯图
    stat_smooth(method=lm,color="red",fill="blue",size=0.8)+  # 添加线性拟合线、设置线的颜色和置信带的颜色
    geom_point(aes(x=mean(mpg),y=mean(wt)),shape=21,fill="yellow",size=4)+   # 绘制均值点
    ggtitle("(a) 散点图+地毯图+线性拟合")

p1 %>% ggMarginal(type="densigram",color="grey50",fill="lightskyblue",alpha=0.5)  # 添加边际密度直方图,设置边际图的边线颜色和填充颜色

2.3 图形观察和代码编写的心得体会

  • 车辆越重,燃油效率越低。通过散点图叠加拟合线、地毯图和边际图,清晰展现了这一趋势。ggplot2的模块化设计让复杂图表构建更高效,关键在于:明确每个图层的作用,按需叠加;分步调试确保效果;优化细节提升可读性。数据可视化能直观揭示变量关系,代码结构清晰更利于维护。

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 散点图矩阵

df <- data |> dplyr::select(-c("cyl","vs","am","gear","carb"))
ggpairs(df,                  # 选择图变量
  lower = list(continuous = "points"),   # 对角线下方绘制点
  upper = list(continuous = "density"))+ # 对角线上方绘制二维核密度图
  theme(axis.title=element_text(size=8))+     # 设置坐标轴标签字体大小
  theme(axis.text=element_text(size=6))       # 设置坐标轴刻度字体大小

3.3 相关系数矩阵图代码

ggCor(df,whaw=1,    # 计算Pearson相关系数
  digits=4,                # 保留4为小数
  label=3,                 # 显示相关系数及其检验的P值
  mode=2,                  # 显示半角矩阵
  xangle=0)+              # 设置x轴标签角度
ggtitle("ggCor函数绘制的相关系数矩阵")

3.4 图形观察和代码编写的心得体会

  • 利用GGally::ggpairs(columns)绘制除cyl、vs、am、gear和carb外6个变量的散点图矩阵; 修改参数upper=list(continuous = “density”) ,将上三角图形改为二维核密度等高线图; 利用ggiraphExtra::ggCor() 绘制除cyl、vs、am、gear和carb外6个变量的相关系数矩阵图。

  • 心得 1. GGally::ggpairs:

    • 通过columns参数筛选变量,避免冗余列(如cyl)。
    • 修改upper=list(continuous="density")快速切换图形类型,提升分析效率。
      2.ggiraphExtra::ggCor:
    • 自动计算并可视化相关系数,颜色深浅和数值结合,直观呈现相关性强度。
    1. 技巧:
    • 变量筛选时直接用列名向量(如c("mpg","wt")),避免手动剔除。
    • 核密度图适合大数据量,散点图+拟合线更侧重趋势分析。

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 六边形分箱散点图

library(viridis)     # 色盲友好的颜色配色包
df <- bigdata

p<-ggplot(df,aes(x=carat,y=price))+                       # 绘制散点图
    theme_bw()+                                   # 使用黑白主题
    theme(panel.grid=element_blank())             # 移除网格线

p1<-p+geom_hex(bins=30,size=0.3,color="black")+   # 六边形分箱
    scale_fill_viridis_c(option="H")+             # 选择配色方案
    ggtitle("六边形分箱散点图")

4.3 二维核密度图

p+stat_density_2d(geom="raster",aes(fill=..density..),contour=FALSE)+ # 绘制二维核密度图
    scale_fill_viridis_c(option="H")+
    ggtitle("二维核密度图")

4.4 散点图+密度等高线

p+geom_point(color="grey20")+                 # 绘制散点图
    geom_density_2d()+                            # 添加等高线
    ggtitle(" 散点图+密度等高线")

4.5 散点图+密度等高线带

p+geom_point(color="grey20")+
    geom_density_2d_filled(alpha=0.8)+
    geom_density_2d(size=0.25,colour="black")+    # 设置等高线宽度和颜色
    guides(fill="none")+                          # 删除图例
    ggtitle("散点图+密度等高线带")

4.6 图形观察和代码编写的心得体会

4.6.1

  1. 六边形分箱(geom_hex:有效解决大数据点重叠问题,直观展示数据密集区域,适合超大规模数据集的可视化。
  2. 二维核密度图(stat_density_2d:通过颜色渐变揭示价格与克拉数的分布规律,避免散点堆积导致的视觉混乱。
  3. 等高线叠加(geom_density_2d:在散点图上增加趋势轮廓,辅助识别价格与重量的主要分布区间。
  4. 填充密度图(geom_density_2d_filled:增强可视化层次感,突出高密度区域,但需控制透明度(alpha)避免遮挡数据点。
  5. 适用场景
    • 六边形分箱:适用于精确分析数据分布密度。
    • 核密度图:适合观察整体趋势,弱化个体数据点。
    • 叠加等高线:在保留原始数据点的同时增强趋势表达。

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散点图代码

attach(mtcars)

s3d<-scatterplot3d(x=hp,y=wt,z=mpg,
  col.axis="blue",col.grid="lightblue",pch=16,highlight.3d=TRUE,
  type="h",box=TRUE,cex.lab=0.7,main="(d)添加二元回归面")
fit<-lm(mpg~hp+wt)
s3d$plane3d(fit,col="grey30")

5.3 气泡图代码

df <- data
ggplot(df,aes(x=hp,y=mpg,color=wt))+
  geom_point(aes(size=wt),alpha=0.5)+   # 气泡大小=总股本
  scale_size(range=c(1,7))+                 # 设置点的大小
  theme(panel.grid.minor=element_blank())+  # 移除次网格线
  theme(plot.title=element_text(size=12))+  # 设置标题字体大小
  theme(legend.text=element_text(size=9,color="blue"))+ # 设置图例字体大小和颜色
  scale_color_binned()+                     # 设置连续分级色键
  guides(size="none")+
  annotate("text",x=300,y=30,label="气泡大小 = 车重",size=4)# 添加注释文本

5.4 图形观察和代码编写的心得体会

5.4.0.1 3D散点图关键观察

  1. 三维关系呈现:可直观看到马力(hp)与车重(wt)呈正比,而两者均与燃油效率(mpg)呈反比
  2. 回归平面特征:平面倾斜方向验证了马力增加和车重增加均会降低燃油效率的复合效应
  3. 离群点识别:某些轻量高马力车型(如运动款)明显偏离主趋势平面

5.4.0.2 气泡图核心发现

  1. 双重编码优势:通过气泡大小(车重)和颜色深浅实现三维数据的二维可视化
  2. 聚类模式:图形右下角集中了”轻量高效”车型,左上角则是”重量高耗”集群
  3. 交互效应:相同马力下,车重越大(气泡越大)的车型mpg普遍更低

5.4.0.3 技术实现要点

  1. 3D散点图
    • 需用scatterplot3d包的旋转功能多角度观察数据
    • 回归平面通过lm(mpg ~ hp + wt)公式生成
  2. 气泡图
    • sizecolor双美学映射需合理设置比例尺
    • 建议添加scale_size_continuous()调整气泡大小范围

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需要转化为因子
df <- data |> mutate(cyl=factor(cyl))

ggplot(data=df,aes(x=wt,y=mpg,color=cyl))+
   geom_point(size=1.5)+       # 设置点的大小
   stat_smooth(method="lm",color="red",fill="deepskyblue",size=0.7)+# 添加拟合直线和置信带
   theme(legend.position="none",                 # 移除图例
         panel.spacing.x=unit(0.2,"lines"),
         panel.spacing.y=unit(0.2,"lines"))+     # 设置子图间距
   facet_grid(~cyl,scale="free_x")  # 按股票类型分组、按上市板块分面

6.3 按形状和颜色分组代码

ggplot(data=df,aes(x=wt,y=mpg,shape=cyl,color=cyl))+
  geom_point(size=2.5)+                     # 设置点的大小
  scale_shape_manual(values=c(10,16,17))+ # 设置点的形状
  scale_color_brewer(palette="Set1")+
  theme(legend.position="bottom")+
  scale_alpha(guide="none")+
  ggtitle("(b) 用点的形状和颜色分组")

6.4 图形观察和代码编写的心得体会

6.4.0.1 发现

  1. 分组规律明显:4缸车辆集中在轻量高效区(左下),6缸居中,8缸则分布在重量大、油耗高的右上区域
  2. 共性趋势:所有组别均呈现车重增加导致燃油效率下降的负相关关系
  3. 组间差异:8缸车的回归线斜率更平缓,说明重量增加对油耗的边际影响相对较小

6.4.0.2 可视化技巧

  1. 双重编码:同步使用颜色和形状区分组别,确保黑白打印时仍可辨识
  2. 动态分面:通过自由缩放x轴(free_x)使各面板充分利用绘图空间
  3. 极简回归:隐藏置信区间(se=FALSE)保持图形简洁,突出主要趋势

6.4.0.3 优化方向

  • 当数据点重叠严重时,可引入抖动(position_jitter)或半透明处理
  • 对非平衡数据(如8缸样本少),可添加箱线图补充分布信息
  • 使用viridis色盲友好配色方案提升可访问性

6.4.0.4 分析启示

气缸数作为关键分类变量,不仅直接影响燃油效率,还调节了车重与油耗的关系强度。这种分组可视化比整体散点图更能揭示数据中的层次结构。