第四章 数据分布可视化

Author

221527117潘悦

1 解释原始数据

  • faithful是R语言中自带的一个经典数据集,它记录了美国黄石国家公园老忠实间歇泉(Old Faithful geyser)的喷发数据。这个数据集经常被用于统计教学和数据分析示例。

  • faithful数据集包含两个变量,共有272个观测值。

    data = faithful
    datatable(data,rownames = FALSE)
  • eruptions: 喷发持续时间,连续数值变量,以分钟为单位,范围:1.6分钟到5.1分钟。

  • waiting: 两次喷发之间的等待时间,连续数值变量,以分钟为单位,范围:43分钟到96分钟。

2 单变量直方图

2.1 绘图要求

  • 利用geom_histogram(aes(y=..density..))绘制eruptions的直方图,使用预设主题:mytheme;

  • 利用geom_rug()为直方图添加地毯图;

  • 利用geom_density()为直方图添加核密度曲线;

  • 利用annotate()在直方图标注峰度和偏度信息;

  • 利用geom_vline() 为直方图添加一条垂直的均值参考线;

  • 利用geom_point()在横轴上添加一个中位数参考点,并在点上方添加文字注释

2.2 作图代码

library(e1071)        # 用于计算偏度系数和峰度系数


df <- data
# 作初始直方图,纵轴默认为频数
ggplot(data=df,aes(x=eruptions))+mytheme+    # 绘制直方图
  geom_histogram(aes(y=..density..),fill="lightgreen",color="gray50")+
  geom_rug(size=0.2,color="blue3")+
  geom_density(color="blue2",size=0.7)+ # 添加核密度曲线
  annotate("text",x=2.5,y=0.7,label=paste0("偏度系数 =",round(skewness(df$eruptions),4)),size=3)+  # 添加注释文本
  annotate("text",x=2.5,y=0.6,label=paste0("峰度系数 =",round(kurtosis(df$eruptions),4)),size=3)+  # 添加注释文本
  geom_vline(xintercept=mean(df$eruptions),linetype="twodash",size=0.6,color="red")+          # 添加均值垂线,并设置线形、线宽和颜色
  annotate("text",x=mean(df$eruptions),y=0.7,label=paste0("均值线",round(mean(df$eruptions),2)),size=3)+  # 添加注释文本
  geom_point(x=median(df$eruptions),y=0,shape=21,size=4,fill="yellow")# 添加中位数点

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

  • 从整体形态看,它呈现出双峰分布,这意味着数据中存在两个不同的集中趋势。左侧峰值较低,右侧峰值较高,说明在数据所代表的现象中,存在两种较为典型的情况,且右侧情况出现的频率相对更高 。

    偏度系数为 -0.4135 ,表明数据呈现左偏态。即左侧长尾,意味着较小值的一端有一些极端值或异常值,拉低了数据的均值。峰度系数为 -1.5116 ,显示出该分布比正态分布更为平坦,数据的离散程度相对较大,在均值附近的数据聚集程度不如正态分布那样高。

    均值线为 3.49 ,而中位数在右侧峰值附近。左偏态下均值小于中位数,说明少数较小值对均值产生了较大影响 。这种分布形态提醒我们在分析数据时,不能仅依赖均值来代表整体水平,中位数可能是更稳健的集中趋势度量。

3 叠加直方图和镜像直方图

3.1 绘图要求

  • 绘制eruptionswaiting两个变量的叠加直方图和镜像直方图,使用预设主题:mytheme。

  • 将数据转化为长型数据再作叠加直方图,利用scale_fill_brewer()将叠加直方图配色方案改为set3

  • 镜像直方图中eruptions在正方向,waiting在负方向,直方数bins=30,并添加文字标签作标签。

  • 两种图都需要针对原始数据作图和标准标准化数据作图,可以使用scale()函数对变量标准化,分类标准化可以使用plyr::ddply()函数。

3.2 叠加直方图代码

df <- data |> 
  gather(eruptions,waiting,key=指标,value=指标值)|>
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框


p1<-ggplot(df)+aes(x=指标值,y=..density..,fill=指标)+
  geom_histogram(position="identity",bins=30,color="gray60",alpha=0.5)+
  scale_fill_brewer(palette = "Set3")+
  theme(legend.position=c(0.8,0.8),# 设置图例位置
       legend.background=element_rect(fill="grey90",color="grey"))+
                                                # 设置图例背景色和边框颜色
  ggtitle("(a) 原始数据的叠加直方图")

p2<-ggplot(df)+aes(x=标准化值,y=..density..,fill=指标)+
  geom_histogram(position="identity",color="gray60",alpha=0.5)+
  scale_fill_brewer(palette = "set3")+
  theme(legend.position=c(0.8,0.8),# 设置图例位置
       legend.background=element_rect(fill="grey90",color="grey"))+
                                                # 设置图例背景色和边框颜色
  ggtitle("(a) 标准化数据的叠加直方图")

grid.arrange(p1,p2,ncol=2) 

3.3 镜像直方图代码

grid.arrange(p1, p2, ncol = 2)

df <- data |>
  mutate(
    std.eruptions=scale(eruptions),
    std.waiting=scale(waiting)
  )

p1<-ggplot(df)+aes(x=x)+
   geom_histogram(aes(x=eruptions,y=..density..),bins=30,color="grey50",fill="red",alpha=0.3)+ # 绘制eruptions的直方图(上图)
   geom_label(aes(x=30,y=0.2),label="eruptions",color="red")+  # 添加标签
   geom_histogram(aes(x=waiting,y=-..density..),color="grey50",fill="blue",alpha=0.3)+ # 绘制waiting的直方图(下图)
   geom_label(aes(x=60,y=-0.1),label="waiting",color="blue")+  # 添加标签
   xlab("指标值")+ggtitle("(a) 原始数据的镜像直方图")

p2<-ggplot(df)+aes(x=x)+
   geom_histogram(aes(x=std.eruptions,y=..density..),bins=30,color="grey50",fill="red",alpha=0.3)+ # 绘制std.eruptions的直方图(上图)
   geom_label(aes(x=0.5,y=0.3),label="eruptions",color="red")+  # 添加标签
   geom_histogram(aes(x=std.waiting,y=-..density..),color="grey50",fill="blue",alpha=0.3)+ # 绘制std.waiting的直方图(下图)
   geom_label(aes(x=0.5,y=-0.3),label="waiting",color="blue")+  # 添加标签
   xlab("指标值")+ggtitle("(b) 标准化数据的镜像直方图")

grid.arrange(p1,p2,ncol=2) 

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

3.5 叠加直方图

  • 数据分布差异明显:“eruptions” 数据集中在左侧低指标值区域,呈现出单峰形态,说明其取值范围相对集中在较小值附近 ;“waiting” 数据分布在右侧较高指标值区域,且分布较为分散,峰值不突出,表明其取值较为分散,没有明显集中趋势。

  • 量纲影响:原始数据因不同变量量纲不同,直观上难以直接对比两者分布特征的相似性或关联性 。

3.5.0.1 标准化数据的叠加直方图

  • 消除量纲便于对比:标准化后消除了量纲影响,两个变量在同一尺度下展示。此时可以看到两者分布有一定重叠区域,说明标准化后能更直观地对比它们在分布形态上的关系。

  • 分布形态特征:“eruptions” 和 “waiting” 都有多个峰值,显示出数据分布并非简单的单峰形态,存在不同的集中趋势,可能暗示数据背后存在多种影响因素或子群体。

3.6 镜像直方图

  • 分布分离显著:“eruptions” 和 “waiting” 的数据分布在指标值上几乎没有重叠。“eruptions” 集中在低指标值区域,“waiting” 集中在高指标值区域 。这表明原始数据中,两个变量在量纲未处理时,分布特征差异极大,反映出它们可能代表不同性质的现象,且量纲差异导致难以直接比较分布特征。

  • 核密度估计形状:能看出各自分布的大致形态,“eruptions” 呈现单峰且较陡峭,说明数据在集中区域离散程度较小;“waiting” 分布相对平缓,说明其数据离散程度较大,取值更为分散。

3.6.1 标准化数据镜像核密度图分析

  • 分布重叠显现:标准化后,“eruptions” 和 “waiting” 的数据分布有明显重叠部分。这说明标准化处理消除量纲影响后,两个变量可在同一尺度下对比,能发现它们在分布上存在关联或相似性,有助于进一步分析变量间潜在关系。

  • 分布形态变化:虽然分布有重叠,但各自形态仍有差异。通过对比可以更清晰地看到标准化如何改变数据的呈现形式,以及如何突出数据间的关系,为后续深入分析数据结构、构建模型等提供基础。

4 核密度图

4.1 绘图要求

  • 绘制eruptions和 waiting两个变量的分组核密度图、分面核密度图和镜像核密度图。

  • 分组核密度图,采用geom_density(position="identity")

  • 分面核密度图,采用geom_density()+facet_wrap(~xx,scale="free")

  • 镜像核密度图中eruptions在正方向,waiting在负方向,直方数bins=30,并添加文字标签作标签。

  • 分组核密度图和镜像核密度图需要针对原始数据作图和标准标准化数据作图。

4.2 分组核密度图

df <- data |> 
  gather(eruptions,waiting,key=指标,value=指标值)|>
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框


p1<-ggplot(df)+aes(x=指标值,y=..density..,fill=指标)+
  geom_density(position="identity",bins=30,color="gray60",alpha=0.5)+
  scale_fill_brewer(palette = "Set3")+
  theme(legend.position=c(0.8,0.8),# 设置图例位置
       legend.background=element_rect(fill="grey90",color="grey"))+
                                                # 设置图例背景色和边框颜色
  ggtitle("(a) 原始数据的核密度图")

p2<-ggplot(df)+aes(x=标准化值,y=..density..,fill=指标)+
  geom_density(position="identity",color="gray60",alpha=0.5)+
  scale_fill_brewer(palette = "set3")+
  theme(legend.position=c(0.8,0.8),# 设置图例位置
       legend.background=element_rect(fill="grey90",color="grey"))+
                                                # 设置图例背景色和边框颜色
  ggtitle("(a) 标准化数据的核密度图")

grid.arrange(p1,p2,ncol=2) 

4.3 分面核密度图

ggplot(df)+aes(x=指标值,fill=指标)+
  geom_density(color="gray60")+
  scale_fill_brewer(palette = "Set3")+
  guides(fill="none")+
  facet_wrap(~指标,ncol=2,scale="free")

4.4 镜像核密度图

df <- data |>
  mutate(
    std.eruptions=scale(eruptions),
    std.waiting=scale(waiting)
  )

p1<-ggplot(df)+aes(x=x)+
   geom_density(aes(x=eruptions,y=..density..),bins=30,color="grey50",fill="red",alpha=0.3)+ # 绘制eruptions的直方图(上图)
   geom_label(aes(x=30,y=0.2),label="eruptions",color="red")+  # 添加标签
   geom_density(aes(x=waiting,y=-..density..),color="grey50",fill="blue",alpha=0.3)+ # 绘制waiting的直方图(下图)
   geom_label(aes(x=60,y=-0.1),label="waiting",color="blue")+  # 添加标签
   xlab("指标值")+ggtitle("(a) 原始数据的镜像核密度图")

p2<-ggplot(df)+aes(x=x)+
   geom_density(aes(x=std.eruptions,y=..density..),bins=30,color="grey50",fill="red",alpha=0.3)+ # 绘制std.eruptions的直方图(上图)
   geom_label(aes(x=0.5,y=0.3),label="eruptions",color="red")+  # 添加标签
   geom_density(aes(x=std.waiting,y=-..density..),color="grey50",fill="blue",alpha=0.3)+ # 绘制std.waiting的直方图(下图)
   geom_label(aes(x=0.5,y=-0.3),label="waiting",color="blue")+  # 添加标签
   xlab("指标值")+ggtitle("(b) 标准化数据的镜像核密度图")

grid.arrange(p1,p2,ncol=2) 

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

4.6 分组核密度图

  • eruptions:蓝色部分代表 “eruptions”,其核密度曲线在左侧较低值区域有明显峰值,说明该变量的数据主要集中在较小值附近,分布较为集中,离散程度相对较小 。

  • waiting:红色部分代表 “waiting”,其核密度曲线在右侧较高值区域有峰值,且曲线较为平缓,说明 “waiting” 变量的数据取值较为分散,离散程度较大,数据分布相对更广泛。

4.6.0.1 对比分析

从图中能直观看到两个变量分布差异明显,几乎没有重叠区域。这表明在原始数据状态下,“eruptions” 和 “waiting” 代表的现象在数值表现上差异显著

4.7 分面核密度图

4.7.0.1 “eruptions” 变量

  • 从左侧分面看,“eruptions” 的核密度曲线呈现出双峰形态。这表明该变量的数据分布并非单一集中趋势,存在两个较为明显的数据聚集区域 。意味着在相关现象中,可能存在两种不同的情况或子群体影响着 “eruptions” 的取值 。

4.7.0.2 “waiting” 变量

  • 右侧分面展示的 “waiting” 核密度曲线也是双峰形态。说明 “waiting” 变量同样具有两个数据集中的区域,反映出其取值也受多种因素影响,存在不同的集中趋势 。

4.7.0.3 综合分析

通过分面核密度图,可以更清晰地观察到每个变量自身的分布细节。分面图能避免不同变量因量纲等差异造成的视觉干扰,专注于单个变量的分布特征。

5 箱线图和小提琴图

5.1 绘图要求

  • 根据实际数据和标准化后的数据绘制eruptionswaiting两个变量的箱线图geom_boxplot和小提琴图geom_violin

  • 采用stat_summary(fun="mean",geom="point")在箱线图和均值图中要添加均值点。

  • 小提琴图中要加入点图和箱线图

  • 采用调色板前两种颜色,brewer.pal(6,"Set2")[1:2] ,作为箱体填充颜色。

"#66C2A5" "#FC8D62" "#8DA0CB" "#E78AC3" "#A6D854" "#FFD92F"

5.2 箱线图代码

mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
   axis.title=element_text(size=10),               # 设置坐标轴标签字体大小
   axis.text=element_text(size=9),                # 设置坐标轴刻度字体大小
   legend.text=element_text(size="8"))            # 设置图例字体大小

# 处理数据
df<-data |> 
  gather(eruptions,waiting,key=指标,value=指标值) |> 
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框

palette<-RColorBrewer::brewer.pal(6,"Set2")[1:2] # 设置调色板
 
# 绘制箱线图
p1<-ggplot(df,aes(x=指标,y=log10(指标值)))+     # y值取对数
  geom_boxplot(fill=palette,outlier.size=0.8)+  # 设置填充颜色和离群点大小
  scale_x_discrete(guide=guide_axis(n.dodge=2))+# x轴标签为2行
  stat_summary(fun="mean",geom="point",shape=21,size=2.5,fill="white")+
  ylab("对数值")+ggtitle("(a) 对数变换")

p2<-ggplot(df,aes(x=指标,y=标准化值))+
  geom_boxplot(fill=palette,outlier.size=0.8)+  # 设置填充颜色和离群点大小
  scale_x_discrete(guide=guide_axis(n.dodge=2))+
  stat_summary(fun="mean",geom="point",shape=21,size=2.5,fill="white")+
  ggtitle("(b) 标准化变换")

grid.arrange(p1,p2,ncol=2)        # 组合图形

5.3 小提琴图代码

  • 通过d3r::d3_nest将数据框转化为层次数据“d3.js”作为绘图输入
# 数据处理
df<-data |> 
  gather(eruptions,waiting,key=指标,value=指标值) |> 
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框

# 设置图形主题
mytheme<-theme(plot.title=element_text(size="11"), # 设置主标题字体大小
   axis.title=element_text(size=10),               # 设置坐标轴标签字体大小
   axis.text=element_text(size=9),                # 设置坐标轴刻度字体大小
   legend.text=element_text(size="8"))            # 设置图例字体大小

# 图(a)原始数据小提琴图

p1<-ggplot(df,aes(x=指标,y=指标值,fill=指标))+
     geom_violin(scale="width",trim=FALSE)+
     geom_point(color="black",size=0.8)+  # 添加点
     geom_boxplot(outlier.size=0.7,outlier.color="white",size=0.3,
               width=0.2,fill="white")+  # 添加并设置箱线图和离群点参数
     scale_fill_brewer(palette="Set2[1:2]")+
     stat_summary(fun=mean,geom="point",shape=21,size=2)+# 添加均值点
     guides(fill="none")+
     stat_summary(fun="mean",geom="point",shape=21,size=2.5,fill="white")+
     geom_dotplot(aes(x=as.numeric(指标)-0.08,group=指标),
               width=0.5,binaxis="y",binwidth=2.5,stackdir="down")+
     ggtitle("(a) 原始数据小提琴图")

# 图(b)数据标准化后的小提琴图
p2<-ggplot(df,aes(x=指标,y=标准化值,fill=指标))+
     geom_violin(scale="width")+
     geom_point(color="black",size=1)+
     geom_boxplot(,outlier.size=0.7,outlier.color="black",size=0.3,
          width=0.2,fill="white")+
     scale_fill_brewer(palette="Set2[1:2]")+
     guides(fill="none")+
     stat_summary(fun="mean",geom="point",shape=21,size=2.5,fill="white")+
     geom_dotplot(aes(x=as.numeric(指标)-0.08,group=指标),
               width=0.5,binaxis="y",binwidth=2.5,stackdir="down")+
     ggtitle("(b) 标准化小提琴图")

grid.arrange(p1,p2,ncol=2)        # 组合图形p1和p2

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

箱线图:

  • 图形类型:分组的箱线图,横轴为变量名(eruptionswaiting),纵轴为数值,填充颜色区分原始数据(Original Data)和标准化数据(Standardized Data)。

  • 颜色标识

    • 青绿色(#66C2A5)代表原始数据。

    • 橙红色(#FC8D62)代表标准化数据。

5.4.0.1 2. 变量分布对比

  • eruptions(喷发持续时间)

    • 原始数据:中位数约3.5分钟,分布右偏(上须较长),存在少量高值离群点。

    • 标准化数据:中位数接近0(因标准化后均值为0),分布形状与原始数据一致,但数值范围缩小(约-2到2)。

    • 关键差异:标准化后,箱体高度压缩,但偏态特征保留。

  • waiting(等待时间)

    1. 原始数据:中位数约76分钟,分布较对称,四分位距(IQR)较宽(约50-90分钟)。

    2. 标准化数据:中位数接近0,箱体高度显著降低(数值范围约-2到2)。

    3. 关键差异:原始数据的数值范围(约40-100分钟)远大于 eruptions,标准化后两者尺度统一。

5.4.0.2 3.标准化效果验证

  • 尺度一致性:标准化后,两个变量的箱线图Y轴范围相近(均围绕0对称),便于直接比较分布形状。

  • 分布形态保留:标准化未改变数据的偏态或离散程度,仅调整了数值尺度。

    小提琴图

    5.4.0.3 1. 整体结构

    • 图形类型:小提琴图(geom_violin)叠加箱线图(geom_boxplot)和均值点(stat_summary)。

    • 横轴:变量名(eruptionswaiting)。

    • 纵轴:数值范围(原始数据与标准化数据分开展示)。

    • 颜色区分

      • 青绿色(#66C2A5):原始数据。

      • 橙红色(#FC8D62):标准化数据。

    5.4.0.4 2. 关键观察点

    5.4.0.4.1 eruptions(喷发持续时间)
    • 原始数据

      • 分布形状:双峰分布(小提琴图两侧凸起),主峰在1.5-2分钟,次峰在4-4.5分钟。

      • 箱线图:中位数约3.5分钟,右偏(上须较长),与双峰特征一致。

      • 均值点(黑色菱形):位于中位数右侧,印证右偏分布。

    • 标准化数据

      • 分布形状:保留双峰特征,但数值压缩到-2到2之间。

      • 均值点:接近0(标准化后均值为0),箱线图高度显著缩小。

    5.4.0.4.2 waiting(等待时间)
    • 原始数据

      • 分布形状:单峰对称分布(峰值约75分钟),箱线图中位数与均值点重合,符合对称性。

      • 离散程度:IQR较宽(约50-90分钟),无显著离群点。

    • 标准化数据

      • 分布形状:仍保持对称,数值范围缩放到-2到2。

    5.4.0.5 3. 标准化效果验证

    • 分布形态保留:标准化未改变数据的基本分布特征(如双峰、对称性),仅调整数值尺度。

    • 可视化优势:标准化后,两变量的分布可在同一尺度下直接对比(如 eruptions 的双峰与 waiting 的单峰差异更清晰)。

    5.4.0.6 4. 图形元素的作用

    • 小提琴图:揭示数据密度(如 eruptions 的双峰),弥补箱线图仅描述四分位数的不足。

    • 箱线图:在小提琴图内部显示中位数、IQR,增强统计量直观性。

    • 均值点

      • 在右偏分布中(如原始 eruptions),均值点与中位数分离,提示分布不对称。

      • 在对称分布中(如 waiting),均值点与中位数重合。

6 威尔金森点图、蜂群图和云雨图

6.1 绘图要求

  • 绘制eruptionswaiting 两个变量的威尔金森点图、蜂群图和云雨图。

  • 三种图形均采用标准化数据作图

  • 威尔金森点图采用geom_dotplot(binaxis="y",bins=30,dotsize = 0.3) ,要求作出居中堆叠和向上堆叠两种情况的图。

  • 蜂群图采用geom_beeswarm(cex=0.8,shape=21,size=0.8),要求作出不带箱线图和带有箱线图两种情况的图。

  • 云雨图采用geom_violindot(dots_size=0.7,binwidth=0.07) ,要求作出横向和纵向图两种情况的图。

6.2 威尔金森点图代码

分别作矩形热图和极坐标热图

library(ggplot2)
library(ggdist)
mytheme<-theme_bw()+theme(legend.position="none")

# 数据处理
df<-data |> 
  gather(eruptions,waiting,key=指标,value=指标值) |> 
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框

p<-ggplot(df,aes(x=指标,y=标准化值,fill=指标))
p1<-p+geom_dotplot(binaxis="y",bins=30,dotsize = 0.3,stackdir="center")+ # 绘制点图
  geom_tile(width = 0.9, height = 0.1) +  # 调整宽度和高度以获得更好的视觉效果
  labs(title = "矩形热图", x = "变量", y = "标准化值") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  mytheme+ggtitle("(a) 居中堆叠")

p2<-p+geom_dotplot(binaxis="y",bins=30,dotsize = 0.3)+ # 绘制点图
  geom_tile(width = 0.9, height = 0.1) +
  coord_polar(theta = "x") +  # 转换为极坐标
  labs(title = "极坐标热图", x = "", y = "标准化值") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  mytheme+ggtitle("(b) 向上堆叠")

grid.arrange(p1,p2,ncol=2)        # 组合图形p1和p2

6.3 蜂群图代码

mytheme<-theme_bw()+theme(legend.position="none")

library(ggbeeswarm)
# 处理数据
df<-data |> 
  gather(eruptions,waiting,key=指标,value=指标值) |> 
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框

# 图(a)5项指标的蜂群图
p<-ggplot(df,aes(x=指标,y=标准化值))
p1<-p+geom_beeswarm(cex=0.8,shape=21,fill="black",size=0.8,aes(color=指标))+# 设置蜂群的宽度、点的形状、大小和填充颜色
mytheme+ggtitle("(a) 蜂群图")

# 图(b)箱线图+蜂群图
p2<-p+geom_boxplot(size=0.5,outlier.size=0.8,aes(color=指标))+
geom_beeswarm(shape=21,cex=0.8,size=0.8,aes(color=指标))+
mytheme+ggtitle("(b) 箱线图+蜂群图")

grid.arrange(p1,p2)

6.4 云雨图代码

library(see)  # 提供主题函数theme_modern
mytheme<-theme_modern()+
         theme(legend.position="none",
               plot.title=element_text(size=14,hjust=0.5))   # 调整标题位置

# 处理数据
df<-data |> 
  gather(eruptions,waiting,key=指标,value=指标值) |> 
  ddply("指标",transform,标准化值=scale(指标值)) # 计算标准化值并返回数据框

p1<-ggplot(df,aes(x=指标,y=标准化值,fill=指标))+
  geom_violindot(dots_size=0.7,binwidth=0.07)+ # 绘制云雨图并设置点的大小和箱宽
  mytheme+ggtitle("(a) 垂直排列(默认)")

p2<-ggplot(df,aes(x=指标,y=标准化值,fill=指标))+
  geom_violindot(dots_size=0.7,binwidth=0.07)+
  coord_flip()+mytheme+ggtitle("(b) 水平排列")

grid.arrange(p1,p2,ncol=2)        # 按2列组合图形p1和p2

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

6.5.0.1 威尔金森点图

6.5.0.1.1 向上堆叠的威尔金森点图
  • 累积分布展示:更侧重于展示数据的累积分布情况。越靠近上方,数据的累积量可能越大 。

  • 分布特征:通过点的疏密程度,可以观察到不同标准化数值组合下数据的集中与分散情况,帮助了解变量之间的关系以及数据的离散程度 。

  • 数据集中趋势:在标准化的等待时间纵轴上,能看到数据点在不同标准化喷发持续时间下的分布。在标准化等待时间 0 - 1.5 左右,数据点相对集中,说明大部分观测中,标准化后的等待时间多处于这个区间,表明实际数据里等待时间在对应范围出现频次高 。

  • 变量关系:从图中横向观察,可大致看出标准化喷发持续时间和等待时间存在一定关联趋势。比如某些标准化喷发持续时间下,标准化等待时间有相对固定的取值范围,暗示喷发持续时间和等待时间可能存在某种内在联系 。

  • 离散程度:数据点在纵轴方向上的分布跨度反映了离散程度。可以看到在某些标准化喷发持续时间下,标准化等待时间的取值范围较宽,说明对应情况下等待时间的离散程度大,数据较为分散 。

6.5.0.2 蜂群图

无箱线图的蜂群图

  1. 集中趋势:从图中可以看出,数据点在纵轴刻度 2 和 4 - 5 附近较为集中,说明火山喷发相关数据在这两个区域出现的频次较高。特别是在 4 - 5 之间,数据点聚集得更为密集,表明该区间内的数据量相对较多 。

  2. 离散情况:在刻度 3 附近数据点较少,说明此数值附近的数据较为稀疏。同时,通过观察数据点的分布范围,可以大致了解数据的离散程度,数据点在纵轴上的分布跨度反映了数据的取值范围 。

箱线图的蜂群图

图中的黑色散点构成蜂群图,展示了每个数据点的具体位置。可以看出,数据点在纵轴 “eruptions” 刻度 2 附近以及 4 - 5 之间分布较为集中 ,说明这些数值对应的火山喷发相关数据出现频率较高 。在刻度 3 附近数据点相对稀疏,表明此区间数据出现频次低 。

  1. 箱体:箱体表示数据的四分位数范围(IQR),即第 25 百分位数(Q1​)到第 75 百分位数(Q3​) 。这意味着中间 50% 的数据落在箱体所覆盖的区间内 ,通过箱体范围可了解数据的离散程度,箱体越宽离散程度越大,反之越小 。

  2. 中位数:箱体中间的横线代表中位数(第 50 百分位数,Q2​) ,它是将所有数据从小到大排序后位于中间位置的数值 。观察中位数在箱体中的位置,可判断数据分布是否对称,若在中间位置说明分布相对对称,若偏向某一端则存在一定偏态 。

6.5.0.3 云雨图

  1. 小提琴图部分:位于图表上方橙色区域,展示了数据的分布形状。它类似于核密度估计图,宽的部分表示数据点集中的区域,窄的部分表示数据点较少的区域 。从图中可以看出,数据在靠近 2 和 4 - 5 的区域较为集中。

  2. 箱线图部分:小提琴图下方的矩形框是箱线图。箱线图的箱体表示数据的四分位数范围(IQR,即第 25 百分位数到第 75 百分位数) ,箱体中间的线表示中位数。箱体两端的须(线)一般表示数据的最小值和最大值(在没有异常值的情况下) 。

  3. 散点部分:箱线图下方的橙色小菱形点代表数据点。这些点展示了实际的观测值,能直观看到数据的离散情况。 可以看到数据点在靠近箱体的区域分布较为密集。

  4. 箱体(四分位数范围):箱线图的箱体反映了数据的中间 50% 分布情况。箱体两端分别对应第 25 百分位数(Q1​)和第 75 百分位数(Q3​) 。从图中可以看出,箱体覆盖的范围表明数据的中间部分主要集中在一定区间内,说明大部分数据处于这个范围。

  5. 中位数:箱体中间的线代表中位数(第 50 百分位数,Q2​) ,它表示将所有数据从小到大排序后位于中间位置的数值。通过观察中位数在箱体中的位置,可以了解数据分布是否对称。若中位数在箱体中间位置,说明数据分布相对对称;若偏向某一端,则数据分布有一定偏态 。

6.5.1 散点部分

  • 图中箱线图下方的橙色小菱形散点代表实际的数据点。可以看到,散点在靠近箱体的区域分布较为密集,说明大部分数据点集中在箱体所涵盖的数值范围内