数据可视化期末报告

Author

221527134 张铭轩

1 报告要求

  • 期末实验报告由5章节5个图形组成,每个章节需要作一个图形。

  • 每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。

  • 案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。

  • 每个章节的数据集合需要通过datatable 函数展示,并简要解释数据来源和变量意义。

  • 每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。

  • 渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档“8、期末报告” 列中。

  • 评分标准:

    • 每章节图形各20分

    • 能有效输出图形和合理解释75%

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

# 加载必要的包
library(ggplot2)
library(DT)
library(dplyr)
library(tidyr)
library(gridExtra)

# 使用内置mtcars数据,将cyl和vs转换为因子
data_mtcars <- mtcars %>%
  mutate(cyl = factor(cyl),
         vs = factor(vs, labels = c("V型", "直列")),
         am = factor(am, labels = c("自动", "手动")))

# 创建两个数据子集用于展示
df1 <- data_mtcars %>%
  count(cyl, vs) %>%
  rename(数量 = n)

df2 <- data_mtcars %>%
  count(cyl, am) %>%
  rename(数量 = n)

# 用datatable展示数据
datatable(df1, 
          rownames = FALSE, 
          options = list(pageLength = 5),
          caption = "表1: 气缸数与发动机类型统计")
datatable(df2, 
          rownames = FALSE, 
          options = list(pageLength = 5),
          caption = "表2: 气缸数与变速器类型统计")

2.2 图形1——多变量条形图

# 图(a) 垂直并列条形图
p1 <- ggplot(df1, aes(x = cyl, y = 数量, fill = vs)) +
  geom_col(width = 0.7, position = position_dodge(0.8), color = "black") +
  scale_fill_manual(values = c("#66c2a5", "#fc8d62")) +
  geom_text(aes(label = 数量), 
            position = position_dodge(0.8), 
            vjust = -0.5, 
            size = 4) +
  labs(title = "(a) 气缸数与发动机类型(垂直并列)",
       x = "气缸数",
       y = "车辆数量",
       fill = "发动机类型") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# 图(b) 水平并列条形图
p2 <- ggplot(df1, aes(x = cyl, y = 数量, fill = vs)) +
  geom_col(width = 0.7, position = position_dodge(0.8), color = "black") +
  scale_fill_manual(values = c("#66c2a5", "#fc8d62")) +
  geom_text(aes(label = 数量), 
            position = position_dodge(0.8), 
            hjust = -0.2, 
            size = 4) +
  coord_flip() +
  labs(title = "(b) 气缸数与发动机类型(水平并列)",
       x = "气缸数",
       y = "车辆数量",
       fill = "发动机类型") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# 图(c) 垂直堆叠条形图
p3 <- ggplot(df2, aes(x = cyl, y = 数量, fill = am)) +
  geom_col(width = 0.7, color = "black") +
  scale_fill_manual(values = c("#8da0cb", "#e78ac3")) +
  geom_text(aes(label = 数量), 
            position = position_stack(vjust = 0.5), 
            size = 4) +
  labs(title = "(c) 气缸数与变速器类型(垂直堆叠)",
       x = "气缸数",
       y = "车辆数量",
       fill = "变速器类型") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

# 图(d) 水平堆叠条形图
p4 <- p3 +
  coord_flip() +
  labs(title = "(d) 气缸数与变速器类型(水平堆叠)")

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

  • 图形解读:(a) 垂直并列条形图(气缸数 vs 发动机类型)

    1. 图形特征

      • 以气缸数(4/6/8缸)为X轴,车辆数量为Y轴

      • 不同颜色柱子并列代表V型/直列发动机

      • 柱子高度可直接比较绝对数量

    2. 关键发现

      • 4缸车:直列发动机占绝对优势(假设图中显示数量更多)

      • 8缸车:可能仅存在V型发动机(若直列对应柱子缺失)

      • 6缸车:两种发动机类型分布较均衡

    3. 业务意义
      → 反映发动机类型与气缸数的技术适配性
      → 直列发动机更倾向小排量(4缸),V型发动机主导大排量(8缸)

    2.2.1 (b) 水平并列条形图(气缸数 vs 发动机类型)

    1. 与(a)图差异

      • 坐标轴翻转,适合类别名称较长或类别较多时

      • 更强调不同气缸数间的比较而非绝对数量

    2. 补充发现

      • 可清晰看到6缸车的发动机类型分布比例(因水平布局更易比较柱宽)

      • 若存在极端值(如某类数量显著高),水平布局能更好展示

    2.2.2 (c) 垂直堆叠条形图(气缸数 vs 变速器类型)

    1. 图形特征

      • 每个气缸数的柱子包含自动/手动变速器的堆叠部分

      • 柱子总高度=该气缸数的总车辆数

    2. 关键发现

      • 4缸车:手动挡占比可能更高(环保车型偏好手动?)

      • 8缸车:自动挡可能占主导(性能车多用自动变速)

      • 整体趋势:随气缸数增加,自动挡比例上升

    3. 业务意义
      → 反映市场对不同动力车型的变速器偏好
      → 指导车企针对不同排量配置变速器类型

    2.2.3 (d) 水平堆叠条形图(气缸数 vs 变速器类型)

    1. 与(c)图差异

      • 更清晰展示各组内比例(手动/自动的堆叠宽度)

      • 适合比较少量类别间的构成比例

    2. 突出优势

      • 可直接观察6缸车中自动/手动挡的近似1:1比例(若存在)

      • 避免柱子过高导致的标签遮挡问题

    2.2.4 (e) 百分比堆叠条形图(气缸数 vs 变速器类型)

    1. 核心特征

      • 所有柱子高度统一为100%

      • 展示各组内自动/手动挡的比例构成

    2. 关键结论

      • 4缸车:手动挡占比可能超70%(假设值)

      • 8缸车:自动挡可能接近90%

      • 技术启示:气缸数与变速器技术存在强相关性

3 数据分布可视化

3.1 案例数据解释与展示

library(vcd)       # 马赛克图核心包
library(DT)        # 交互式表格
library(dplyr)     # 数据处理

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

# 2. 用datatable展示数据
datatable(titanic_df,
          rownames = FALSE,
          filter = "top",
          options = list(
            pageLength = 8,
            autoWidth = TRUE,
            dom = 'Bfrtip',
            buttons = c('copy', 'csv', 'excel')
          ),
          caption = "泰坦尼克号乘客统计数据(Class/Sex/Age/Survived)",
          extensions = 'Buttons')

3.2 图形2——马赛克图

# 3. 创建马赛克图(4个分类变量)
library(mosaic)
mosaic(~ Class + Sex + Age + Survived, 
       data = titanic_df,
       main = "泰坦尼克号乘客生存情况马赛克图",
       sub = "方块面积与人数成正比",
       shade = TRUE,           # 添加颜色深浅表示残差
       labeling = labeling_border(
         rot_labels = c(0, 0, 0, 0),  # 控制标签旋转
         just_labels = c("left", "right", "center", "right"),
         offset_varnames = c(1, 1, 1, 0.5)
       ),
       legend = TRUE)          # 显示残差图例

  • 图形解读:主要层级(从左到右):
    • 船舱等级(1st > 2nd > 3rd > Crew)

    • 性别(Male > Female)

    • 年龄(Child > Adult)

    • 生存状态(No > Yes)

  • 关键发现
    • 头等舱女性生存率最高(深蓝色块显著)

    • 三等舱男性生存率最低(深红色块突出)

    • 儿童整体生存率高于成人

  • 统计显著性
    • 极显著(p-value < 2.22e-16)

    • 颜色深浅反映实际与预期生存率的差异

结论:船舱等级和性别是影响生存的最关键因素。

4 变量关系可视化

4.1 案例数据解释与展示

# 加载必要包
library(corrplot)
library(DT)
library(datasets)

# 使用内置数据集mtcars(数值型数据适合关联分析)
data <- mtcars[, c(1, 3:7)]  # 选择部分变量展示

# 计算相关系数矩阵
cor_matrix <- round(cor(data), 2)

# 用datatable展示相关系数矩阵
datatable(as.data.frame(cor_matrix),
          rownames = TRUE,
          options = list(pageLength = 10),
          caption = "mtcars数据集相关系数矩阵")

4.2 图形3——关联图

# 创建关联图
corrplot(cor_matrix,
         method = "color",        # 颜色方块表示相关强度
         type = "upper",          # 只显示上三角
         order = "hclust",        # 按层次聚类排序
         tl.col = "black",        # 标签颜色
         tl.srt = 45,             # 标签旋转角度
         addCoef.col = "black",   # 系数文本颜色
         number.cex = 0.8,        # 系数文本大小
         col = colorRampPalette(c("#6D9EC1", "white", "#E46726"))(200),
         mar = c(0, 0, 2, 0),     # 边距调整
         title = "mtcars变量关联图")

  • 图形解读:最强正相关
    • dispwt(0.89):发动机排量越大,车身重量越重

    • hpdisp(0.79):马力越大通常排量也越大

  • 最强负相关
    • mpgwt(-0.87):车重越重,油耗效率越低

    • mpgdisp(-0.85):大排量发动机油耗效率低

  • 异常关联
    • qsec(加速时间)与其他变量相关性普遍较弱

    • mpghp(-0.78)呈现明显负相关

4.2.1 可视化改进建议代码

5 样本相似性可视化

5.1 案例数据解释与展示

# 加载必要包
library(ggplot2)
library(DT)
library(dplyr)

# 使用内置数据集mtcars(添加行名列)
data <- mtcars %>% 
  tibble::rownames_to_column("car")

# 用datatable展示数据
datatable(data,
          rownames = FALSE,
          extensions = 'Buttons',
          options = list(
            pageLength = 5,
            dom = 'Bfrtip',
            buttons = c('copy', 'csv', 'excel')
          ),
          caption = "mtcars数据集(含车型名称)")

5.2 图形4——点阵图

# 创建点阵图(按马力排序)
ggplot(data, aes(x = reorder(car, hp), y = hp)) +
  geom_point(size = 3, color = "steelblue") +  # 绘制点
  geom_segment(aes(xend = car, yend = 0),      # 添加垂直线
    color = "gray70") +
  coord_flip() +                               # 转为水平布局
  labs(
    title = "车型马力分布点阵图",
    x = "车型",
    y = "马力(hp)"
  ) +
  theme_minimal() +
  theme(
    panel.grid.major.y = element_blank(),      # 隐藏横向网格线
    axis.text.y = element_text(size = 8)       # 调整y轴文字大小
  )

# 进阶版:分面点阵图(按气缸数分组)
ggplot(data, aes(x = reorder(car, mpg), y = mpg)) +
  geom_point(aes(color = factor(cyl)), size = 3) +
  facet_grid(rows = vars(cyl), scales = "free_y", space = "free") +
  coord_flip() +
  scale_color_brewer(palette = "Set1", name = "气缸数") +
  labs(title = "分车型油耗效率(按气缸数分组)")

  • 图形解读:分组逻辑
    • 按气缸数(cyl)分为4组(4缸/6缸/8缸)

    • 每组内部按油耗效率(mpg)从高到低排序

  • 关键车型定位
    • 最佳油耗(4缸组):

      • Toyota Corolla(最左侧顶点)

      • Honda Civic

    • 最差油耗(8缸组):

      • Lincoln Continental

      • Cadillac Fleetwood

6 时间序列可视化

6.1 案例数据解释与展示

# 加载必要包
library(ggplot2)
library(DT)
library(dplyr)

# 使用内置数据集iris(取前20行避免过度拥挤)
data <- iris[1:20, ] %>% 
  mutate(flower_id = paste("Flower", 1:20))  # 添加花朵ID

# 用datatable展示数据
datatable(data,
          rownames = FALSE,
          extensions = 'Buttons',
          options = list(
            dom = 'Bfrtip',
            buttons = c('copy', 'csv', 'excel'),
            pageLength = 5
          ),
          caption = "鸢尾花数据集(前20个样本)")

6.2 图形5——热力图

# 创建极坐标条形图(展示花瓣和萼片长度)
ggplot(data, aes(x = flower_id)) +
  geom_col(aes(y = Sepal.Length, fill = "萼片长度"), 
           width = 0.7, color = "white") +
  geom_col(aes(y = Petal.Length, fill = "花瓣长度"), 
           width = 0.4, color = "white", position = "identity") +
  coord_polar(start = -0.2) +  # 极坐标转换(设置起始角度)
  scale_fill_manual(values = c("萼片长度" = "#1f78b4", "花瓣长度" = "#e31a1c")) +
  labs(
    title = "鸢尾花特征极坐标条形图",
    subtitle = "外层:萼片长度 | 内层:花瓣长度",
    fill = "特征类型"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(size = 8, vjust = 0.5),
    axis.title = element_blank(),
    panel.grid.major.x = element_line(color = "gray90"),
    legend.position = "bottom"
  )

  • 图形解读:坐标系特征
    • 径向轴(半径方向):表示特征值大小(花瓣/萼片长度)

    • 角度轴:每个角度区间对应一个花朵样本(Flower 1-20)

  • 数据层展示
    • 外层蓝色条:萼片长度(数值更大,范围通常4-7cm)

    • 内层红色条:花瓣长度(数值较小,范围通常1-6cm)

  • 关键样本识别
    • 最大值:Flower 8(最外层的蓝色条突出)

    • 最小值:Flower 15(径向长度最短)

    • 特殊对比:Flower 3(花瓣与萼片长度差异最大)