数据可视化期末报告

Author

221527219吴胜景

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 数据集名称: ChickWeight

    来源: R语言内置数据集 (datasets包)

    研究背景: 比较4种不同饲料配方对小鸡生长速度的影响

    变量说明: weight - 小鸡体重(克) ,Time - 测量时间(天,0=出生日), Chick - 小鸡个体编号(1-50) ,Diet - 饲料配方分组: 1: 基础饲料 2: 基础+蛋白质补充 3: 基础+氨基酸补充 4: 基础+维生素补充

library(reshape2)
library(DT)
data(ChickWeight)

# 转换为宽格式
data <- dcast(ChickWeight, Chick + Diet ~ Time, value.var = "weight")

# 显示
DT::datatable(data, rownames = FALSE)

2.2 图形1——分组条形图

library(ggplot2)
library(dplyr)

# 准备数据:获取第21天的数据并按饲料组计算统计量
final_data <- ChickWeight %>%
  filter(Time == 21) %>%
  group_by(Diet) %>%
  summarise(
    mean_weight = mean(weight, na.rm = TRUE),
    sd_weight = sd(weight, na.rm = TRUE),
    n = n()
  ) %>%
  mutate(
    Diet = factor(Diet, labels = c("基础饲料", "蛋白质补充", "氨基酸补充", "维生素补充"))
  )

# 绘制分组条形图
ggplot(final_data, aes(x = Diet, y = mean_weight, fill = Diet)) +
  geom_col(
    width = 0.8,
    position = position_dodge(0.9),
    color = "gray50",
    show.legend = FALSE  # 因为x轴已经是分组标签,不需要图例
  ) +
  geom_errorbar(
    aes(ymin = mean_weight - sd_weight, ymax = mean_weight + sd_weight),
    width = 0.2,
    position = position_dodge(0.9)
  ) +
  geom_text(
    aes(label = round(mean_weight, 1)),
    position = position_dodge(0.9),
    vjust = -1.5,  # 将标签放在误差条上方
    size = 4
  ) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title = "不同饲料组第21天平均体重比较",
    x = "饲料类型",
    y = "平均体重(克)",
    caption = "误差条表示±1个标准差"
  ) +
  ylim(0, 1.1 * max(final_data$mean_weight + final_data$sd_weight)) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 15, hjust = 1)
  )

  • 图形解读:(1)饲料效果排序 :氨基酸补充(270.3g) > 维生素补充(238.6g) ≈ 蛋白质补充(214.7g) > 基础饲料(177.8g)

    最优组:氨基酸补充组(Diet 3)体重显著高于其他组,比基础组高52%

    次优组:维生素补充组(Diet 4)和蛋白质补充组(Diet 2)效果相近

    最差组:基础饲料组(Diet 1)表现明显落后

    (2)组内变异程度

    变异最大:氨基酸组(误差条最长,标准差±71.5g),说明个体对该饲料反应差异较大 变异最小:基础饲料组(标准差±58.7g),个体间生长较均匀

3 数据分布可视化

3.1 案例数据解释与展示

  • 数据集名称: ChickWeight

    来源: R语言内置数据集 (datasets包)

    研究背景: 分析体重(weight)在饲料组(Diet)间的分布,展示不同饲料组(Diet)的体重分布核密度图

    变量说明: weight - 小鸡体重(克) ,Time - 测量时间(天,0=出生日), Chick - 小鸡个体编号(1-50) ,Diet - 饲料配方分组: 1: 基础饲料 2: 基础+蛋白质补充 3: 基础+氨基酸补充 4: 基础+维生素补充

library(ggplot2)
library(dplyr)
library(reshape2)  # 用于数据融合

# 数据准备:选择第21天数据并标准化
density_data <- ChickWeight %>%
  filter(Time == 21) %>%  # 聚焦实验终点
  mutate(
    Diet = factor(Diet, labels = c("基础饲料", "蛋白质", "氨基酸", "维生素")),
    scaled_weight = scale(weight)  # 标准化体重
  )

datatable(density_data,rownames = F)

3.2 图形2——分组核密度图

# 绘制分组核密度图
 ggplot(density_data) +
  aes(x = weight, y = after_stat(density), fill = Diet) +
  geom_density(
    position = "identity", 
    alpha = 0.5,          # 设置半透明
    color = "gray40",     # 密度曲线边框色
    linewidth = 0.5       # 边框线粗细
  ) +
  scale_fill_brewer(
    palette = "Set3",     # 使用Set3调色板
    name = "饲料类型"     # 修改图例标题
  ) +
  labs(
    title = "不同饲料组第21天体重的分布比较",
    x = "体重(克)",
    y = "密度",
    caption = "数据来源:R内置数据集ChickWeight"
  ) +
  theme_minimal() +
  theme(
    legend.position = c(0.85, 0.8),  # 调整图例位置
    legend.background = element_rect(
      fill = "grey90", 
      color = "grey70"
    ),
    plot.title = element_text(face = "bold", hjust = 0.5)
  ) +
  # 添加均值参考线
  geom_vline(
    data = density_data %>% group_by(Diet) %>% summarise(mean = mean(weight)),
    aes(xintercept = mean, color = Diet),
    linetype = "dashed",
    show.legend = FALSE
  )

  • 图形解读:基础饲料(绿色):曲线低矮宽阔,养不足导致生长不稳定。

    蛋白质(黄色):双峰结构,可能存在亚群分化。

    氨基酸(紫色):左偏长尾,对部分个体效果不佳。

    维生素组(粉色):曲线基本对称,无显著拖尾,近似正态分布;说明维生素补充效果稳定,个体差异小。

4 变量关系可视化

4.1 案例数据解释与展示

  • 数据集名称: ChickWeight

    来源: R语言内置数据集 (datasets包)

    研究背景: 展示不同饲料组(Diet)的体重随时间变化的关系,并添加线性趋势线。

    变量说明: weight - 小鸡体重(克) ,Time - 测量时间(天,0=出生日), Chick - 小鸡个体编号(1-50) ,Diet - 饲料配方分组: 1: 基础饲料 2: 基础+蛋白质补充 3: 基础+氨基酸补充 4: 基础+维生素补充。

library(ggplot2)
library(dplyr)

# 数据准备:将Diet转换为因子并添加标签
chick_plot_data <- ChickWeight %>%
  mutate(Diet = factor(Diet, 
                      levels = c(1, 2, 3, 4),
                      labels = c("基础饲料", "蛋白质", "氨基酸", "维生素")))
datatable(chick_plot_data,rownames = F)

4.2 图形3——grid.arrange(p1,p2,ncol=2)

library(gridExtra)

p1 <- ggplot(chick_plot_data, aes(x = Time, y = weight, color = Diet)) +
  geom_point(size = 1.5, alpha = 0.7) +  # 半透明点避免重叠
  stat_smooth(method = "lm", 
              color = "red", 
              fill = "deepskyblue", 
              size = 0.5) +
  facet_grid(~ Diet, scales = "free_x") +  # 按饲料组分面
  scale_color_brewer(palette = "Set1") +
  labs(title = "小鸡体重随时间变化(按饲料组分面)",
       x = "时间(天)", 
       y = "体重(克)") +
  theme_minimal() +
  theme(legend.position = "none",
        panel.spacing = unit(0.2, "lines"),
        strip.text = element_text(face = "bold"))  # 分面标题加粗

# 版本2:形状+颜色分组(整体图)
p2 <- ggplot(chick_plot_data, aes(x = Time, y = weight, 
                                 shape = Diet, color = Diet)) +
  geom_point(size = 2.5, alpha = 0.8) +
  scale_shape_manual(values = c(16, 17, 15, 18)) +  # 实心不同形状
  scale_color_brewer(palette = "Set2") +
  stat_smooth(method = "lm", se = FALSE, size = 0.5) +  # 添加趋势线
  labs(title = "小鸡生长轨迹(形状颜色双重分组)",
       x = "时间(天)", 
       y = "体重(克)") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_text(face = "bold"))

# 并排显示两个版本
grid.arrange(p1,p2,ncol=2)

  • 图形解读:

    分面图(p1): 氨基酸组(绿色)斜率最大,生长最快;基础饲料组(红色)趋势线最平缓

    组合图(p2): 维生素组(粉色菱形)后期体重集中度高;蛋白质组(黄色三角)个体差异明显

    生物学意义 :

    氨基酸的显著优势:促进蛋白质合成效率,直接支持肌肉生长 维生素组的稳定性:代谢调节作用减少个体差异 基础组的局限:营养不足导致生长潜力受限

5 样本相似性可视化

5.1 案例数据解释与展示

  • 数据集名称: ChickWeight

    来源: R语言内置数据集 (datasets包)

    研究背景: 对数据进行层次聚类分析,分析不同小鸡个体的生长模式相似性。

    变量说明: weight - 小鸡体重(克) ,Time - 测量时间(天,0=出生日), Chick - 小鸡个体编号(1-50) ,Diet - 饲料配方分组: 1: 基础饲料 2: 基础+蛋白质补充 3: 基础+氨基酸补充 4: 基础+维生素补充。

library(factoextra)
library(dplyr)
library(RColorBrewer)
library(ggplot2)


# 数据准备:转换为宽格式(每只小鸡一条记录,时间点为变量)
wide_data <- ChickWeight %>%
  select(Chick, Time, weight) %>%
  tidyr::pivot_wider(
    names_from = Time,
    values_from = weight,
    names_prefix = "Day"
  ) %>%
  na.omit()  # 移除未完成实验的个体

# 提取数值矩阵并标准化
mat <- wide_data %>% 
  select(-Chick) %>% 
  as.matrix()
rownames(mat) <- wide_data$Chick  # 用小鸡编号作为行名

# 计算欧式距离并聚类
d <- dist(scale(mat), method = "euclidean")
hc <- hclust(d, method = "ward.D2")

datatable(wide_data,rownames = F)

5.2 图形4——系统聚类树状图

# 可视化(假设分为3类)
cols <- brewer.pal(3, "Set1")
fviz_dend(
  hc,
  k = 3,
  k_colors = cols,
  color_labels_by_k = TRUE,
  type = "circular",
  cex = 0.6,  # 缩小标签字体
  lwd = 0.6,
  repel = TRUE,
  main = "小鸡生长模式聚类树状图 (k=3)"
)

# 提取聚类结果
cluster <- cutree(hc, k = 3)

# 分析聚类与饲料组的关系
result <- wide_data %>%
  mutate(Cluster = factor(cluster)) %>%
  left_join(
    ChickWeight %>% 
      select(Chick, Diet) %>% 
      distinct(),
    by = "Chick"
  )

# 统计交叉表
table(Cluster = result$Cluster, Diet = result$Diet)
       Diet
Cluster 1 2 3 4
      1 7 5 4 1
      2 3 4 6 8
      3 6 1 0 0
# 可视化聚类中心生长曲线
result_long <- result %>%
  tidyr::pivot_longer(
    cols = starts_with("Day"),
    names_to = "Time",
    values_to = "Weight"
  ) %>%
  mutate(Time = as.numeric(gsub("Day", "", Time)))

ggplot(result_long, aes(x = Time, y = Weight, color = Cluster)) +
  stat_summary(fun = mean, geom = "line", size = 1.2) +
  scale_color_manual(values = cols) +
  labs(title = "三类生长模式平均曲线",
       x = "时间(天)", y = "平均体重(克)") +
  theme_minimal()

  • 图形解读:

    树状图:分支长度反映个体生长模式差异程度,同颜色分支表示生长轨迹相似的群体。

    生长曲线: 第1类(蓝色)快速增长型,第2类(红色)中等增速型,第3类(绿色)缓慢增长型。

6 时间序列可视化

6.1 案例数据解释与展示

  • 数据集名称: ChickWeight

    来源: R语言内置数据集 (datasets包)

    研究背景: 对数据作折线图,展示不同饲料组小鸡体重随时间的变化模式。

    变量说明: weight - 小鸡体重(克) ,Time - 测量时间(天,0=出生日), Chick - 小鸡个体编号(1-50) ,Diet - 饲料配方分组: 1: 基础饲料 2: 基础+蛋白质补充 3: 基础+氨基酸补充 4: 基础+维生素补充。

library(ggplot2)
library(dplyr)
library(ggpol) 

# 数据准备:计算各饲料组每天的平均体重
plot_data <- ChickWeight %>%
  group_by(Diet, Time) %>%
  summarise(
    mean_weight = mean(weight, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  mutate(
    Diet = factor(Diet, labels = c("基础饲料", "蛋白质", "氨基酸", "维生素"))
  )

datatable(plot_data,rownames = F)

6.2 图形5——分面折线图

# 绘制分面折线图
ggplot(plot_data, aes(x = Time, y = mean_weight, color = Diet)) +
  geom_line(linewidth = 0.6) +
  # 高亮关键生长期(第10-20天)
  geom_tshighlight(
    aes(xmin = 10, xmax = 20),  # 高亮第10-20天
    color = "skyblue",
    fill = "lightblue",
    alpha = 0.05
  ) +
  scale_x_continuous(
    breaks = seq(0, 21, by = 7),  # 每周标记一次
    expand = c(0, 0)
  ) +
  scale_color_brewer(palette = "Set1") +
  facet_wrap(~ Diet, ncol = 2, scales = "free_y") +  # 按饲料组分面
  labs(
    title = "不同饲料组小鸡平均体重变化",
    x = "生长时间(天)",
    y = "平均体重(克)",
    color = "饲料类型"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid.minor = element_blank(),
    strip.text = element_text(face = "bold")
  )

  • 图形解读:

    蓝色高亮区域:标记第10-20天的关键生长期 。氨基酸组(绿色):增长斜率最大,后期明显领先 。基础饲料组(红色):增长最缓慢。

    生物学意义:

    氨基酸优势:显著促进蛋白质合成,支持肌肉快速发育 。维生素特性:调节代谢平衡,带来更平稳的增长曲线。基础组局限:营养不足导致生长潜力未充分表达。高亮区重要性:第10-20天是营养干预的关键窗口期。