数据可视化期末报告

Author

221527221黄俊炜

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 本章使用2023年中国主要城市人口密度,GDP等数据,分析部分与整体关系。
library(DT)
# 1. 读取数据
 data <- read.csv("cities_data.csv", header = TRUE, fileEncoding = "UTF-8")
 datatable(data)

2.2 图形1——矩形树状图

library(treemap)

data$土地面积分组 <- cut(data$土地面积.平方公里., breaks = 3, labels = c("小", "中", "大"))
        
p1<-treemap(data,
        index = c("土地面积分组", "城市"),
        vSize = "GDP.亿元.",
        vColor = "人口密度.人.平方公里.",
        type = "value",
        title = "按土地面积分组的城市GDP",
        fontsize.labels = c(12, 8),  # 两级标签大小(分组标签较大,城市标签较小)
        align.labels = list(
            c("center", "top"),     # 第一级标签(土地面积分组)居中靠上
            c("left", "bottom")      # 第二级标签(城市)靠左靠下
        ),
        palette = "RdYlBu",
        bg.labels = "transparent"    
)

p2<-treemap(data,
        index = "城市",                     # 分组变量(必须是分类变量)
        vSize = "GDP.亿元.",               
        vColor = "人口密度.人.平方公里.",   
        type = "value",                     
        title = "城市GDP与人口密度",
        palette = "RdYlBu"
)

  • 图形解读: 按土地面积分组的城市GDP图形中:分析土地面积对GDP和人口分布的影响,揭示土地资源与经济发展的深层次关系。
  1. 土地面积分组影响 嵌套结构:城市按土地面积分为“小/中/大”三组: 小面积组(如深圳、厦门):GDP高但土地受限,人口密度极高。 大面积组(如北京、成都):GDP高且土地资源充裕,人口密度相对较低。
  2. 异常值发现 深圳:在“小面积组”中GDP最高,但人口密度远超同组其他城市。 杭州:在“大面积组”中人口密度最低,可能与城市规划或地理限制有关。

城市GDP与人口密度图形中:分析城市GDP与人口密度的直接关联,快速识别经济强市和高密度城市。

  1. GDP规模对比 矩形面积直接反映各城市GDP总量: 深圳、上海、北京等一线城市的矩形最大(GDP最高)。 厦门、无锡等城市的矩形较小(GDP相对较低)。

2. 人口密度分布 颜色深浅表示人口密度: 红色/黄色(高密度):深圳(8908人/平方公里)、东莞(4262人/平方公里)。 蓝色(低密度):杭州(743人/平方公里)、长沙(890人/平方公里)。

3. 直观结论 高GDP高密度:深圳、上海、广州等城市同时具备高GDP和高人口密度。 低GDP低密度:合肥、济南等城市GDP和人口密度均较低。 ####

3 数据分布可视化

3.1 案例数据解释与展示

  • 本章使用2023年中国主要城市人口密度,GDP等数据,
library(ggplot2)
data <- read.csv("cities_data.csv", fileEncoding = "UTF-8")
datatable(data)

3.2 图形2——小提琴图

library(ggplot2)
library(dplyr)
library(tidyr)

# 选择需要标准化的数值列
numeric_cols <- c("人口密度.人.平方公里.", "GDP.亿元.", "土地面积.平方公里.")

# 标准化并保留分组列
data_std <- data %>%
  mutate(across(all_of(numeric_cols), ~ as.numeric(scale(.))))

# 按土地面积分组
data_std$土地面积分组 <- cut(data_std$土地面积.平方公里., 
                          breaks = quantile(data_std$土地面积.平方公里., probs = c(0, 0.33, 0.66, 1)),
                          labels = c("小", "中", "大"))


data_std_long <- data_std %>%
  pivot_longer(
    cols = c("人口密度.人.平方公里.", "GDP.亿元."),
    names_to = "指标",
    values_to = "标准化值"
  )

# 分面绘制
ggplot(data_std_long, aes(x = 土地面积分组, y = 标准化值, fill = 指标)) +
  geom_violin(alpha = 0.6, position = position_dodge(0.8)) +
  geom_boxplot(width = 0.1, position = position_dodge(0.8), fill = "white") +
  facet_wrap(~指标, nrow = 2) +
  scale_fill_manual(values = c("#66C2A5", "#FC8D62")) +
  labs(
    title = "标准化后的指标分布对比",
    y = "标准化值",
    fill = "指标"
  ) +
  theme_bw()

  • 图形解读:
  1. 土地面积与人口密度的关系

分布特征

  • 小面积城市组

    • 人口密度分布呈现 显著右偏(右侧长尾),标准化值普遍>0(高于全国均值)。

    • 如深圳(标准化值≈2.5)、东莞等城市密度极端高,反映土地资源紧张倒逼高密度发展。

  • 大面积城市组

    • 密度分布集中在 -1到0.5 之间(接近或略低于均值),如北京、成都。

    • 分布更对称,说明土地充裕时密度可控。

2.土地面积与GDP的关系

分布差异

  • 中等面积城市组

    • GDP分布 最分散(从-1到2.5),既有上海、苏州等高值,也有无锡、佛山等中值。

    • 反映经济结构多元化(工业、服务业均衡)。

  • 大面积城市组

    • 存在 低GDP拖尾(如长沙、合肥标准化值<0),但北京例外(高GDP+大面积)。
  • 小面积城市组

    • GDP分布集中(0.5~2.5),依赖高附加值产业(如深圳的科技、金融)。

3.人口密度 vs. GDP:北京:高GDP但密度适中(标准化值≈0.5),说明规模效应+规划合理。 长沙:低GDP+低密度(双负),提示增长潜力未被释放。

4 变量关系可视化

4.1 案例数据解释与展示

  • 本章使用波士顿房价数据集创建六边形分箱图,展示不同变量之间的关系和密度分布。
  • CRIM: 城镇人均犯罪率 ZN: 住宅用地比例 INDUS: 非零售商业用地比例 CHAS: 是否临河(1=是,0=否) NOX: 氮氧化物浓度 RM: 住宅平均房间数 AGE: 1940年前建成的自住单位比例 DIS: 到波士顿五个就业中心的加权距离 RAD: 径向高速公路可达性指数 TAX: 每10,000美元的全额财产税税率 PTRATIO: 城镇师生比 B: 黑人比例 LSTAT: 低收入阶层比例 MEDV: 自住房屋的中位数价值(单位:千美元)
library(hexbin)
library(ggplot2)
library(DT)

house_data <- read.csv("house_data.csv")
datatable(house_data)

4.2 图形3——六变形分箱散点图

# 1. 房间数(RM)与房价中位数(MEDV)的关系
p1<-ggplot(house_data, aes(x = RM, y = MEDV)) +
    geom_hex(bins = 30) +
    scale_fill_gradient(low = "lightblue", high = "darkblue") +
    labs(title = "房间数与房价中位数的关系(六边形分箱图)",
       x = "每户平均房间数",
       y = "房价中位数(千美元)",
       fill = "数据点密度") +
    theme_minimal()
print(p1)

# 2. 低收入人口比例(LSTAT)与房价中位数(MEDV)的关系
p2<-ggplot(house_data, aes(x = LSTAT, y = MEDV)) +
  geom_hex(bins = 30) +
  scale_fill_gradient(low = "lightblue", high = "darkblue") +
  labs(title = "低收入人口比例与房价中位数的关系",
       x = "低收入人口比例(%)",
       y = "房价中位数(千美元)",
       fill = "数据点密度") +
  theme_minimal()
print(p2)

  • 图形解读:

  • 1. 房间数(RM) vs. 房价中位数(MEDV)

    观察到的关系:

    • 明显的正相关:六边形颜色从浅蓝(低密度)向深蓝(高密度)过渡的区域显示,随着房间数(RM)的增加,房价中位数(MEDV)总体呈上升趋势。

    • 关键分布特征

      • 高密度区域:集中在 RM = 5.5–7.0MEDV = 20–30(千美元),这是最常见的房屋类型。

      • 异常点:当房间数超过7时,房价显著升高(部分住宅可能属于高端房产)。

      • 非线性关系:房价增长在RM > 6.5后加速,可能反映高端房产的溢价效应。

    实际意义:

    • 房间数是房价的重要正向预测指标,但需注意:房间数过少(RM < 5)的房屋价格较低,可能对应老旧或小户型住宅。房间数过多(RM > 8)的数据点稀疏,可能代表异常值或豪宅(需进一步验证)。

    2. 低收入人口比例(LSTAT) vs. 房价中位数(MEDV)

    观察到的关系:

    • 强烈的负相关:六边形颜色从浅绿(低密度)向深绿(高密度)显示,随着低收入人口比例(LSTAT)增加,房价中位数(MEDV)显著下降。

    • 关键分布特征

      • 高密度区域:集中在 LSTAT = 5–15%MEDV = 20–30(千美元),代表中产阶级社区。

      • 极端情况

        • 当LSTAT > 30%时,房价普遍低于20(千美元),可能对应贫困区域。

        • 当LSTAT < 5%时,房价较高(MEDV > 30),但数据点较少(可能是富裕社区)。

      实际意义:

    • 低收入人口比例是房价的强负向预测指标,反映社会经济地位对房价的影响:

      • 高LSTAT区域(低收入集中)的房价低迷,可能与教育资源、治安等因素相关。

5 样本相似性可视化

5.1 案例数据解释与展示

  • 随机生成基因表达矩阵,行=基因,列=样本,值=标准化表达量,发现共表达基因簇或样本分组。
library(gplots)

# 设置随机种子保证结果可重复
set.seed(123)

# 生成随机基因表达矩阵
n_genes <- 50  # 基因数量
n_samples <- 10  # 样本数量
expr_matrix <- matrix(rnorm(n_genes * n_samples, mean = 10, sd = 3), 
                      nrow = n_genes,
                      ncol = n_samples)

# 添加行名和列名
rownames(expr_matrix) <- paste0("Gene_", 1:n_genes)
colnames(expr_matrix) <- paste0("Sample_", LETTERS[1:n_samples])

datatable(expr_matrix)

5.2 图形4——热力图

heatmap.2(expr_matrix,
          trace = "none",  # 不显示trace线
          col = colorRampPalette(c("blue", "white", "red"))(100),
          scale = "none",  
          distfun = function(x) dist(x, method = "euclidean"),
          hclustfun = function(x) hclust(x, method = "complete"),
          margins = c(5.3,3),  # 调整边距以适应标签
          cexRow = 0.5,  # 行标签大小
          cexCol = 0.9,  # 列标签大小
          main = "基因表达热力图",
          dendrogram = "both",  # 显示行和列的树状图
          key = TRUE,  # 显示颜色键
          keysize = 2,  # 颜色键大小
          density.info = "none")  # 不显示密度图

  • 图形解读:1. 热图结构

    • 颜色键(Color Key):显示数值范围从5到15,蓝色表示低表达值,红色表示高表达值,白色表示中间值

    • 列(样本):显示9个样本(Sample_A到Sample_I,按聚类结果重新排序)

    • 行(基因):显示13个基因(Gene_6到Gene_46,按聚类结果重新排序)

      2. 聚类分析

      样本聚类(列)

    • 样本明显分为两个主要簇:

      • 右侧簇:包含Sample_H, Sample_I, Sample_A, Sample_F

      • 左侧簇:包含Sample_C, Sample_G, Sample_B, Sample_E, Sample_D

    • Sample_H和Sample_I关系最近,与其他样本差异较大

      基因聚类(行)

    • 基因也分为两个主要表达模式:

      • 上部基因(如Gene_19, Gene_42):在右侧样本簇(Sample_H, I, A, F)中表达较高(红色)

      • 下部基因(如Gene_6, Gene_34):在左侧样本簇(Sample_C, G, B, E, D)中表达较高

        3. 表达模式观察

    • 差异表达基因

      • Gene_19和Gene_42在Sample_H和Sample_I中表达显著高于其他样本

      • Gene_6和Gene_34在左侧样本簇中表达较高

    • 样本特异性

      • Sample_H和Sample_I显示出独特的基因表达谱,与其他样本明显不同

      • Sample_C和Sample_G表达模式相似

        4. 潜在生物学意义

    • 标记基因

      • Gene_19和Gene_42可能是右侧样本簇(特别是Sample_H和I)的特征基因

      • Gene_6和Gene_34可能是左侧样本簇的特征基因

    • 异常样本:Sample_A和Sample_F虽然聚类在右侧,但表达模式介于两组之间,可能需要进一步检查

6 时间序列可视化

6.1 案例数据解释与展示

  • 气候变化数据,时间=月份,类别=地区(北半球/南半球/赤道),值=温度异常值,对比不同区域气候变暖趋势
library(ggplot2)
library(ggstream)

climate_data <- data.frame(
  month = rep(1:12, each = 3),
  region = rep(c("North", "Equator", "South"), 12),
  anomaly = c(rnorm(12, 1.2, 0.3), rnorm(12, 0.8, 0.2), rnorm(12, 0.5, 0.1))
)
datatable(climate_data)

6.2 图形5——流线图

library(ggplot2)
library(dplyr)

climate_data$month <- as.numeric(climate_data$month)

# 使流线对称
climate_centered <- climate_data %>%
  group_by(month) %>%
  mutate(anomaly_centered = anomaly - mean(anomaly))

ggplot(climate_centered, aes(x = month, y = anomaly_centered, fill = region)) +
  geom_area(position = "identity", alpha = 0.8) +
  scale_x_continuous(breaks = 1:12, labels = month.abb) +
  labs(title = "温度异常流线图",
       x = "Month", y = "Centered Anomaly", fill = "Region") +
  theme_minimal()

  • 图形解读:
    1. Y 轴(Centered Anomaly)

      • 数值经过中心化处理(减去各月份均值),因此:

        • 正值:该区域温度异常高于当月全球平均。

        • 负值:该区域温度异常低于当月全球平均。

      • 例如:北半球(红色)在大部分月份高于均值,南半球(蓝色)普遍低于均值。

    2. X 轴(Month)

      • 显示1-12月(Jan-Dec),流线趋势反映季节性变化:

        • 北半球夏季(Jun-Aug)异常值较高(红色区域更宽)。

        • 南半球夏季(Dec-Feb)异常值略升(蓝色区域变宽)。

    3. 区域颜色

      • North(红色):北半球温度异常最显著,波动较大。

      • Equator(青色):赤道地区异常值居中,变化平缓。

      • South(蓝色):南半球异常值最低,波动较小。

    4. 对称性

      • 流线围绕 y=0 对称,说明中心化处理成功,各区域异常值相互抵消。
    5. 关键结论

      北半球主导变暖:红色区域面积更大,表明北半球对全球温度异常贡献最大。

      季节性差异:北半球冬季(Dec-Feb)异常值略有下降,但仍高于南半球同期。

      赤道稳定性:青色区域波动最小,说明赤道地区温度异常较稳定。