第三章 类别数据可视化

Author

kaka

1 解释原始数据

  • Titanic数据集是datasets包的配套案例数据,可以通过as.data.frame将其转化为数据框。解析数据包含哪些变量,如果是分类变量分别有哪些类别?

    该数据集包含以下5个变量:

    1. Class(乘客舱位等级) - 分类变量

      • 1st (头等舱)

      • 2nd (二等舱)

      • 3rd (三等舱)

      • Crew (船员)

    2. Sex(性别) - 分类变量

      • Male (男性)

      • Female (女性)

    3. Age(年龄) - 分类变量

      • Child (儿童)

      • Adult (成人)

    4. Survived(是否生还) - 分类变量

      • No (未生还)

      • Yes (生还)

    5. Freq(频数) - 数值变量

      • 表示对应组合的乘客/船员人数
data = as.data.frame(Titanic)
DT::datatable(data,rownames = FALSE)

2 条形图

绘制Sex和 Survived的并列条形图和堆叠条形图,并为条形图添加频数标签。

2.1 数据准备

  • 下面代码作了什么数据处理?为什么要这样处理?

  • select(Sex,Survived,Freq)从原始数据中只保留Sex(性别)、Survived(是否生还)和Freq(频数)三列聚焦于分析性别与生还率的关系,去除其他无关变量(如舱位等级、年龄等)

    summarise(n=sum(Freq),.by=c(Sex,Survived))按性别和生还状态的组合分组,对每组计算总人数(n = sum(Freq)),将原始的列联表格式数据聚合为更简洁的汇总统计

    rename(性别=Sex,生还=Survived,人数=n)将英文列名改为中文:Sex→“性别”,Survived→“生还”,n→“人数”,使展示结果更易被中文使用者理解

    DT::datatable(df,rownames = FALSE)使用DT包创建交互式数据表格,隐藏行名(rownames = FALSE),提供可排序、可搜索的友好数据展示方式

# 数据准备
df <- data %>% select(Sex,Survived,Freq) %>% 
  summarise(n=sum(Freq),.by=c(Sex,Survived)) %>% 
  rename(性别=Sex,生还=Survived,人数=n)

DT::datatable(df,rownames = FALSE)

2.2 利用geom_col函数作图

library(tidyverse)
library(DT)

# 数据准备
df <- data %>% 
  select(Sex, Survived, Freq) %>% 
  summarise(n = sum(Freq), .by = c(Sex, Survived)) %>% 
  rename(性别 = Sex, 生还 = Survived, 人数 = n)

# 并列条形图
ggplot(df, aes(x = 性别, y = 人数, fill = 生还)) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = 人数), position = position_dodge(width = 1), vjust = -0.5) +
  labs(title = "并列条形图:性别与生还情况",
       x = "性别",
       y = "人数")

# 堆叠条形图
ggplot(df, aes(x = 性别, y = 人数, fill = 生还)) +
  geom_col() +
  geom_text(aes(label = 人数), position = position_stack(vjust = 0.5)) +
  labs(title = "堆叠条形图:性别与生还情况",
       x = "性别",
       y = "人数")

# 显示数据表格
DT::datatable(df, rownames = FALSE)
  • 你可以通过修改数据或者修改刻度标签将图中性别和生还的类别标签改为中文,请给出代码完成修改。
library(tidyverse)
library(DT)
data <- data.frame(
  Sex = c("male", "female", "male", "female"),
  Survived = c(0, 0, 1, 1),
  Freq = c(400, 100, 200, 300)
)

# 数据准备
df <- data %>% 
  select(Sex, Survived, Freq) %>% 
  summarise(n = sum(Freq), .by = c(Sex, Survived)) %>% 
  mutate(
    性别 = factor(Sex, levels = c("male", "female"), labels = c("男性", "女性")),
    生还 = factor(Survived, levels = c(0, 1), labels = c("未生还", "生还"))
  ) %>% 
  select(性别, 生还, 人数 = n)

# 并列条形图
ggplot(df, aes(x = 性别, y = 人数, fill = 生还)) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = 人数), position = position_dodge(width = 1), vjust = -0.5) +
  labs(
    title = "并列条形图:性别与生还情况",
    x = "性别",
    y = "人数",
    fill = "生还情况"
  )

# 堆叠条形图
ggplot(df, aes(x = 性别, y = 人数, fill = 生还)) +
  geom_col() +
  geom_text(aes(label = 人数), position = position_stack(vjust = 0.5)) +
  labs(
    title = "堆叠条形图:性别与生还情况",
    x = "性别",
    y = "人数",
    fill = "生还情况"
  )

# 显示数据表格
DT::datatable(df, rownames = FALSE)

2.3 介绍图形特点和信息

2.3.1 图(a) 垂直并列条形图

  • 特点:将不同性别(男性、女性)按照生还情况(未生还、生还)分组,每组的条形并列展示 。每个性别类别下,不同生还情况的条形相互独立,通过横向位置区分,便于直观对比同一性别下不同生还状态的差异 。

  • 信息:可以看出男性中未生还人数为 400,生还人数为 200;女性中未生还人数为 100,生还人数为 300 。明显男性未生还人数远多于女性,而女性生还人数多于男性。

2.3.2 图(b)堆叠条形图

  • 特点:以性别(男性、女性)为分类基础,将生还情况(未生还、生还)的人数在同一性别条形内进行堆叠展示 。通过不同颜色区分不同生还状态,能直观呈现各性别中不同生还情况的构成比例。

  • 信息:男性中未生还人数 400,生还人数 200,未生还人数占比较大;女性中未生还人数 100,生还人数 300,生还人数占比较大 。从整体上可对比出男女生还情况的差异,以及各性别内部生还情况的分布。

3 帕累托图

绘制Class 的帕累托图。

3.1 数据准备

# 转换数据格式
data <- as.data.frame(Titanic)

# 数据准备
df <- data %>% 
  select(Class, Freq) %>% 
  group_by(Class) %>% 
  summarise(n = sum(Freq)) %>% 
  rename(乘客舱位 = Class, 人数 = n) %>% 
  arrange(desc(人数)) %>% 
  mutate(
    累积百分比 = cumsum(人数) / sum(人数) * 100,
    累积百分比 = round(累积百分比, 1),
    乘客舱位 = fct_inorder(乘客舱位)
  )

3.2 利用geom_col()+geom_line()+geom_point()等函数作图

library(ggplot2)
library(scales)  # 用于百分比格式
library(tidyverse)
library(DT)

# 转换数据格式
data <- as.data.frame(Titanic)

# 数据准备
df <- data %>% 
  select(Class, Freq) %>% 
  group_by(Class) %>% 
  summarise(n = sum(Freq)) %>% 
  rename(乘客舱位 = Class, 人数 = n) %>% 
  arrange(desc(人数)) %>% 
  mutate(
    累积百分比 = cumsum(人数) / sum(人数) * 100,
    累积百分比 = round(累积百分比, 1),
    乘客舱位 = fct_inorder(乘客舱位)
  )

# 绘制帕累托图
ggplot() +
  geom_col(data = df, aes(x = 乘客舱位, y = 人数), fill = "blue") +
  geom_line(data = df, aes(x = 乘客舱位, y = 累积百分比, group = 1), color = "red", size = 1) +
  geom_point(data = df, aes(x = 乘客舱位, y = 累积百分比), color = "red", size = 3) +
  geom_text(data = df, aes(x = 乘客舱位, y = 累积百分比, label = paste0(累积百分比, "%")), 
            vjust = -0.5, color = "red") +
  scale_y_continuous(
    name = "人数",
    sec.axis = sec_axis(~., name = "累积百分比(%)")
  ) +
  labs(title = "乘客舱位的帕累托图",
       x = "乘客舱位")

# 显示数据表格
DT::datatable(df, rownames = FALSE)

3.3 介绍图形特点和信息

图形特点 1. 双纵轴:左侧纵轴表示人数,用于衡量不同乘客舱位的具体数量规模;右侧纵轴表示累积百分比(%) ,用于展示各舱位人数累积占总人数的比例情况。 2. 柱状与折线结合:使用蓝色柱子直观呈现每个乘客舱位的人数,同时通过红色折线及圆点展示累积百分比的变化趋势,两者结合能从数量和占比两个维度展示信息。 3. 标签标注:在折线上对应每个舱位的位置,以红色字体标注了累积百分比数值,便于快速读取关键数据。

图形信息 1. 舱位人数分布:从柱子高度可知,“Crew”舱位人数最多,其次是“3rd”舱位,“1st”舱位次之,“2nd”舱位人数最少 。 2. 累积占比情况:“Crew”舱位人数占总人数的40.2%;当加上“3rd”舱位后,累积占比达到72.3% ;再加上“1st”舱位,累积占比提升至87.1%;最后加上“2nd”舱位,累积占比达到100% 。这表明前三个舱位(Crew、3rd、1st )涵盖了大部分人数,体现了帕累托法则中少数类别占据大部分比重的特点。

4 脊形图

绘制Class和 Survived 的脊形图。

4.1 数据准备

# 数据准备
data <- as.data.frame(Titanic)

# 处理数据,统计每个 Class 和 Survived 组合下的人数
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

4.2 利用geom_col() 作图

library(ggplot2)
library(dplyr)
library(tidyverse)
library(ggridges) # 这里虽然主要用 geom_col 但可以引入该包方便数据处理

# 数据准备
data <- as.data.frame(Titanic)

# 处理数据,统计每个 Class 和 Survived 组合下的人数
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 绘制类似脊形布局的柱状图
ggplot(df, aes(x = n, y = factor(Class), fill = factor(Survived))) +
  geom_col(position = "stack") +
  labs(
    title = "Class 和 Survived 类似脊形布局的柱状图",
    x = "人数",
    y = "Class",
    fill = "Survived"
  ) +
  scale_fill_manual(values = c("No" = "red", "Yes" = "green")) +
  theme_ridges()

4.2.1 图表特点说明:

  1. 分层堆叠柱状:图形采用分层的堆叠柱状形式,以不同乘客舱位(Class)为分层依据,每个舱位对应一根横向的堆叠柱。柱子按 “生还(Survived = Yes)” 和 “未生还(Survived = No)” 两种状态堆叠,直观展示各舱位内不同生还状态的构成。

  2. 色彩区分:利用绿色代表 “生还(Yes)”,红色代表 “未生还(No)”,通过鲜明的色彩对比,能快速区分不同生还状态的人数分布。

  3. 坐标布局:纵轴为乘客舱位类别,横轴为人数,这种布局便于比较不同舱位的总人数以及各舱位内不同生还状态的人数规模。

4.2.2 图形信息

  1. 舱位总人数对比:“Crew” 舱位总人数最多,其次是 “3rd” 舱位,“2nd” 舱位和 “1st” 舱位人数相对较少。

  2. 生还情况分布

    • Crew 舱位:未生还人数远多于生还人数,未生还占据柱子大部分长度。

    • 3rd 舱位:同样未生还人数明显多于生还人数,但生还比例相对 Crew 舱位略高。

    • 2nd 舱位:生还和未生还人数差距相对较小,不过未生还人数仍多于生还人数。

    • 1st 舱位:生还和未生还人数较为接近,生还人数占比在各舱位中相对较高。

4.3 利用ggiraphExtra包ggSpine()

library(dplyr)
library(ggiraphExtra) 
library(ggridges)
library(tidyverse)
# 数据准备
data <- as.data.frame(Titanic)
df$Class <- as.numeric(df$Class)
df$Survived <- as.numeric(df$Survived)
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")%>%
  mutate(Class = factor(Class, levels = c("1st", "2nd", "3rd", "Crew")),
         Survived = factor(Survived, levels = c("No", "Yes")))


library(ggiraphExtra)
library(ggplot2)
library(dplyr)

# 数据准备
data <- as.data.frame(Titanic)

# 正确的数据处理
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 确保Class和Survived是因子变量
df$Class <- factor(df$Class, levels = c("1st", "2nd", "3rd", "Crew"))
df$Survived <- factor(df$Survived, levels = c("No", "Yes"))

ggSpine(data=df,aes(x=Class,fill=Survived),
  palette="Reds",labelsize=3,reverse=TRUE)  # 反转调色板颜色

4.4 介绍图形特点和信息

  • 图形特点

    1. 视觉表现

      • 每个舱位的面积高度与人数占比成正比(如船员占比最大,二等舱最小)。

      • 颜色区分不同舱位,适合快速比较构成比例。

    2. 交互功能(需 interactive=TRUE):

      • 悬停时显示具体人数和占比。

      • 支持缩放(若用 ggiraph::girafe() 包装)。

    3. 适用场景

      • 强调各类别的相对比例而非绝对数值。

      • 展示多类别数据的构成(如人口分布、市场份额)。

        通过脊柱图,可以清晰看出泰坦尼克号上 船员和三等舱乘客占主导 的分布特征。

5 树状图和旭日图

绘制Class、Sex、Age和Survived4个变量的矩形树状图和旭日图

5.1 利用treemap::treemap()函数作树状图

library(dplyr)
library(treemap)
library(tidyverse)

data <- as.data.frame(Titanic)

# 数据处理
df <- data %>%
  group_by(Class, Sex, Age, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 绘制矩形树状图
treemap(
  df,
  index = c("Class", "Sex", "Age", "Survived"),
  vSize = "n",
  vColor = "Survived",
  type = "categorical",
  title = "Class、Sex、Age和Survived的矩形树状图"
)

5.1.1 图形特点解析

视觉元素 作用
区块面积 人数成正比(船员区块最大,二等舱最小)
颜色深浅 反映数值大小(深色=人数多/占比高)
标签格式 显示舱位名称、具体人数和百分比(如Crew\n885人(40.2%)
交互提示 鼠标悬停时显示完整数据(需在Shiny等交互环境中使用)

树状图展示泰坦尼克号乘客的舱位分布,通过面积和颜色快速传达「船员和三等舱占主导」的核心结论。

5.2 利用sunburstR::sunburst() 函数作旭日图

  • 通过d3r::d3_nest将数据框转化为层次数据“d3.js”作为绘图输入
library(dplyr)
library(d3r)      # 用于数据层次化
library(sunburstR) # 用于绘制旭日图

data <- as.data.frame(Titanic)

# 数据处理
df <- data %>%
  group_by(Class, Sex, Age, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 构建用于sunburstR的层级数据
df_sunburst <- df %>%
  mutate(
    hierarchy = paste(Class, Sex, Age, Survived, sep = "/"),
    value = n
  ) %>%
  select(hierarchy, value)
library(sunburstR)
# 绘制旭日图
library(sunburstR)
sunburst(data=df_sunburst,           # 绘制旭日图
   valueField="hierarchy",    # 计算大小字段的字符为vSize
   count=TRUE,                   # 在解释中包括计数和总数
   sumNodes=TRUE)                # 默认总和节点=TRUE
Legend
print
function (x, ...) 
UseMethod("print")
<bytecode: 0x0000018f298cd578>
<environment: namespace:base>

5.3 介绍图形特点和信息

5.3.1 图形特点解析

视觉元素 作用
环形层级 内环→外环依次表示:根节点→舱位→性别→生还状态
扇形面积 Count值成正比(面积越大,人数越多)
颜色区分 不同舱位使用对比色,性别/生还状态用同色系深浅区分
交互功能 悬停显示人数和占比,点击钻取下级,路径导航条显示当前层级

通过旭日图,可以直观发现:

  • 船员和三等舱男性未生还比例极高(最外层红色扇形面积大)

  • 头等舱女性生还率最高(深绿色扇形占比突出)

  • 层级穿透分析:从舱位→性别→生还状态逐层下钻,揭示事故中的生存差异。

6 热图和南丁格尔玫瑰图

绘制Class和Survived 的点阵图、热图和南丁格尔玫瑰图。

6.1 数据准备

# 数据准备
data <- as.data.frame(Titanic)
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

6.2 利用ggiraphExtra::ggHeatmap()作热力图

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

# 加载必要的包
library(tidyverse)
library(ggiraphExtra)
library(DT)

# 数据准备
data <- as.data.frame(Titanic)
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 绘制矩形热图
rect_heatmap <- ggHeatmap(
  data = df,
  mapping = aes(x = Class, y = Survived, size = n, fill = n),
  title = "Class 和 Survived 的矩形热图"
)
print(rect_heatmap)

# 绘制极坐标热图
polar_heatmap <- ggplot(df, aes(x = Class, y = Survived, fill = n)) +
  geom_tile() +
  scale_fill_gradient(low = "white", high = "blue") +
  coord_polar() +
  labs(title = "Class 和 Survived 的极坐标热图",
       x = NULL,
       y = NULL,
       fill = "人数")
print(polar_heatmap)

# 显示数据表格
DT::datatable(data, rownames = FALSE)

6.2.0.1 热图图形特点

  • 图形特点

    • 矩阵布局:以矩阵形式呈现,Class 作为横轴类别,Survived 作为纵轴类别 ,每个单元格对应一种 ClassSurvived 的组合。

    • 颜色编码:通过颜色深浅表示人数 n 的多少,右侧颜色图例显示了颜色与人数的对应关系,颜色越深代表人数越多。

    6.2.0.2 图形信息

    • 舱位与生还关系:可以看出不同舱位(1st2nd3rdCrew )中,“未生还(No)” 和 “生还(Yes)” 的人数差异。比如,Crew 舱位 “未生还” 的人数对应的颜色较深,表明人数较多;而 1st 舱位 “生还” 人数对应的颜色相对较深,说明该舱位生还人数相对较多。

6.2.0.3 极坐标热图图形特点

6.2.0.4 图形特点

  • 极坐标形式:采用极坐标布局,以圆形为基础,不同的 Class 分布在圆周上,Survived 分为 “生还(Yes)” 和 “未生还(No)” 两个部分。

  • 环形分层:通过环形的分层和颜色深浅来体现人数多少,环形的宽度和颜色对应着相应 ClassSurvived 组合下的人数,右侧颜色图例展示了颜色与人数的映射关系。

6.2.0.5 图形信息

  • 舱位与生还分布:从图中能直观看到各舱位在 “生还” 和 “未生还” 上的分布情况。例如,Crew 舱位在 “未生还” 部分的环形区域较大且颜色深,意味着未生还人数多;1st 舱位在 “生还” 部分相对表现较好,环形区域有一定占比且颜色也反映出有相当数量的生还人数。

6.3 利用ggiraphExtra::ggRose() 作玫瑰图

# 加载所需的包
library(tidyverse)
library(ggiraphExtra)
library(DT)

# 数据准备
data <- as.data.frame(Titanic)
df <- data %>%
  group_by(Class, Survived) %>%
  summarise(n = sum(Freq), .groups = "drop")

# 使用 ggRose 绘制玫瑰图
rose_plot <- ggRose(
  data = df,
  mapping = aes(x = Class, y = n, fill = Survived),
  title = "Class 和 Survived 的玫瑰图"
)

print(rose_plot)

# 显示数据表格
DT::datatable(data, rownames = FALSE)

6.4 介绍图形特点和信息

  • 图形特点

    • 环形结构:采用环形的布局方式,以圆心为中心,向外扩展成不同宽度的环形区域。环形被分割成多个部分,分别对应不同的 Class1st2nd3rdCrew )。

    • 颜色编码:利用两种颜色区分 Survived 的两种状态,浅橙色代表 “未生还(No)”,深橙色代表 “生还(Yes)” 。通过颜色可以快速区分不同舱位中不同的生还情况。

    • 双环设计:存在内外两个环形区域,不同的环形区域宽度可能代表不同的数值量级,直观展示不同舱位在生还和未生还人数上的差异。

    6.4.1 图形信息

    • 舱位人数对比:从环形的宽度能看出,Crew3rd 舱位占据的环形区域较宽,说明这两个舱位的总人数相对较多;而 1st2nd 舱位的环形区域较窄,总人数相对较少 。

    • 生还情况分布:在每个舱位对应的环形区域内,颜色的分布反映了生还情况。例如,Crew3rd 舱位中浅橙色(未生还)占据较大比例,表明这两个舱位未生还人数较多;相对而言,1st2nd 舱位中深橙色(生还)的占比情况可能相对较好,暗示这两个舱位的生还人数比例可能相对较高 。

7 饼环图

绘制Class和 Sex的饼环图。

7.1 数据准备

# 数据准备
data <- as.data.frame(Titanic)
df <- data %>%
  group_by(Class, Sex) %>%
  summarise(n = sum(Freq), .groups = "drop")

7.2 利用ggiraphExtra::ggPieDonut()作饼环图

# 加载必要的包
library(ggiraphExtra)
library(ggplot2)
# 数据准备
data <- as.data.frame(Titanic)
df <- data %>%
  group_by(Class, Sex) %>%
  summarise(n = sum(Freq), .groups = "drop")


# 绘制饼环图
ggPieDonut(
  data = df,
  aes(pies = Class, donuts = Sex),
  interactive = TRUE,  # 设置为交互式
  title = "Titanic Passengers by Class and Sex"
)

7.3 介绍图形特点和信息

7.4 介绍图形特点和信息

  • 图形特点

    • 类型:环形饼图,通过不同颜色区分不同类别,各部分占比以百分比标注。

    • 结构:由内外两层构成,外层进一步细分性别,内层展示舱位等级和船员类别 。

    7.4.1 展示信息

    • 舱位等级与人员类别占比:1st(一等舱)、2nd(二等舱)、3rd(三等舱)、Crew(船员)各占 25% ,说明这三类乘客数量相近。

    • 性别分布:在每个舱位等级和船员类别中,男性(Male)和女性(Female)又各占该部分的 50%,即对应 12.5% 。