数据可视化期末报告

Author

221527141 赵禹泽

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 数据说明:
本数据来自《2023年8-17日主要城市空气质量情况》,原始数据文件由生态环境部或权威平台发布,包含中国多个城市的空气质量监测数据。

✅ 变量含义:
  • City:城市名称(中英文并列)

  • SO2:二氧化硫年平均浓度(μg/m³)

  • NO2:二氧化氮年平均浓度(μg/m³)

  • PM10:可吸入颗粒物年平均浓度(μg/m³)

  • CO:一氧化碳 95 百分位浓度(mg/m³)

  • O3:臭氧日最大8小时90百分位浓度(μg/m³)

  • PM2.5:细颗粒物年平均浓度(μg/m³)

  • AQ_Days:空气质量达标(优良)天数(单位:天)

注:各项浓度值均为年平均或年度统计值,单位已标准化。 ")
library(ggiraphExtra)
library(ggplot2)
library(dplyr)
library(readxl)
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) %>%
  select(
    City = 2,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  ) %>%
  filter(complete.cases(.))  # 移除NA行
data <- df
DT::datatable(data)

2.2 图形1——雷达图

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

# 1. 数据读取与清洗(处理字符型数值)
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) %>%
  select(
    City = 2,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  ) %>%
  mutate(across(-City, ~ as.numeric(gsub("[^0-9.]", "", .)))) %>%  # 移除特殊字符并转数值
  filter(complete.cases(.))  # 移除NA行

# 2. 自定义主题(仿照您的风格)
mytheme <- theme(
  legend.position = "right",          # 图例在右侧
  axis.text.x = element_text(size = 9, color = "blue4"),  # 坐标轴文字
  plot.title = element_text(hjust = 0.5, face = "bold"),  # 标题居中加粗
  panel.background = element_blank(), # 透明背景
  axis.line = element_line(color = "grey80")  # 轴线颜色
)

# 3. 绘制雷达图
ggRadar(
  data = df,
  aes(group = City),       # 按城市分组
  rescale = TRUE,          # 自动标准化到[0,1]范围
  alpha = 0.3,             # 填充透明度
  size = 1.5,              # 线条粗细
  interactive = FALSE      # 非交互式
) +
  mytheme +
  xlab("污染物指标") +      # x轴标签
  ylab("标准化浓度值") +    # y轴标签
  ggtitle("多城市污染物浓度雷达图") +  # 标题
  scale_fill_viridis_d() +  # 使用viridis色系填充
  scale_color_viridis_d()   # 使用viridis色系描边

  • 图形解读:

  • 2.2.0.1 1. 污染物分布特征

    指标 典型表现城市 可能污染源 健康风险
    PM2.5 北京、石家庄凸出 燃煤、机动车尾气、二次颗粒物 心血管/呼吸系统疾病
    PM10 北方城市普遍较高 扬尘、建筑粉尘、工业排放 肺部炎症
    NO₂ 上海、广州峰值明显 机动车尾气(柴油车为主) 呼吸道刺激
    O₃ 南方城市突出 光化学反应(VOCs+NOx+高温) 肺功能损伤、植物毒性

    2.2.0.2 2. 区域污染模式对比

    北方城市(如北京、石家庄)

    • 图形呈现”双颗粒物突出”特征(PM2.5和PM10值接近外圈)

    • 反映燃煤供暖+沙尘影响的复合污染

    沿海城市(如上海、广州)

    • 显示”NO₂-O₃耦合”现象(高温高湿加剧光化学反应)

    • 机动车排放主导的污染结构

    中西部城市(如成都)

    • 整体图形较紧凑,但PM2.5常超标

    • 盆地地形导致扩散条件差

    2.2.0.3 3. 关键发现

    • 最严重污染类型:北京PM2.5浓度标准化值达0.92(接近最大值1)

    • 最清洁指标:各城市SO₂普遍控制较好(图形最内缩)

    • 季节差异提示:南方O₃高值可能与分析时段(夏季数据)相关

    2.2.0.4 4. 政策建议

    1. 京津冀地区

      • 重点控制燃煤和工业排放(降低PM2.5/SO₂)

      • 加强区域联防联控

    2. 长三角/珠三角

      • 优化交通结构(减少NOx排放)

      • 实施VOCs源头替代

    3. 通用措施

      • 建立污染过程预警机制(尤其O₃和PM2.5复合污染)

      • 推广清洁能源替代

3 数据分布可视化

3.1 案例数据解释与展示

  • 本数据来自《2023年8

    -17日主要城市空气质量情况》,原始数据文件由生态环境部或权威平

    台发布,包含中国多个城市的空气质量监测数据。

    ✅ 变量含义:

    • City:城市名称(中英文并列)

    • SO2:二氧化硫年平均浓度(μg/m³)

    • NO2:二氧化氮年平均浓度(μg/m³)

    • PM10:可吸入颗粒物年平均浓度(μg/m³)

    • CO:一氧化碳 95 百分位浓度(mg/m³)

    • O3:臭氧日最大8小时90百分位浓度(μg/m³)

    • PM2.5:细颗粒物年平均浓度(μg/m³)

    • AQ_Days:空气质量达标(优良)天数(单位:天)

df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    CO = 6,
    O3 = 7,
    PM2.5 = 8,
    AQ_Days = 9
  ) 

data <- df
DT::datatable(data)

3.2 图形2——污染物相关气泡图

library(ggplot2)
library(readxl)
library(dplyr)

# 读取数据(跳过前两行非数据内容)
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    CO = 6,
    O3 = 7,
    PM2.5 = 8,
    AQ_Days = 9
  ) 

# 转换数据类型(确保数值为 numeric)
df <- df |>
  mutate(
    PM2.5 = as.numeric(PM2.5),
    AQ_Days = as.numeric(AQ_Days),
    CO = as.numeric(CO)
  )

# 绘制气泡图
ggplot(df, aes(x = PM2.5, y = AQ_Days, size = CO, color = City)) +
  geom_point(alpha = 0.7) +
  scale_size_continuous(range = c(3, 15)) +
  theme_minimal() +
  labs(
    title = "PM2.5 与空气质量达标天数的关系",
    x = "PM2.5 年平均浓度 (μg/m³)",
    y = "空气质量达标天数 (天)",
    size = "CO 浓度 (mg/m³)"
  )

  • 图形解读:

  • 3.2.1 1. 城市分类分析

    3.2.1.1 (1) 清洁城市(左上区域)

    • 典型城市:海口、拉萨、福州

      • 特征:PM2.5<20 μg/m³,达标天数>350天

      • 原因

        • 海口/拉萨:低工业排放+优越扩散条件

        • 福州:沿海气候+严格排放管控

    3.2.1.2 (2) 污染突出城市(右下区域)

    • 典型城市:石家庄、太原、天津

      • 特征:PM2.5>50 μg/m³,达标天数<250天

      • 原因

        • 冬季燃煤供暖

        • 工业排放(钢铁、化工)

        • 地形不利扩散(如石家庄位于太行山前)

    3.2.1.3 (3) 交通污染型城市(中等PM2.5+高CO)

    • 典型城市:北京、上海、广州

      • 特征:PM2.5 30-40 μg/m³,但CO浓度显著偏高(气泡较大)

      • 原因:机动车尾气排放主导(需结合NO₂数据验证)

    3.2.2 2. CO浓度(气泡大小)的附加信息

    • 高CO城市(大气泡):

      • 北京、重庆、贵阳

      • 提示 不完全燃烧(老旧车辆/燃煤锅炉)

    • 低CO城市(小气泡):

      • 海口、拉萨

      • 反映清洁能源占比高

    3.2.3 3. 政策建议

    3.2.3.1 针对性措施

    城市类型 治理重点 具体措施
    高PM2.5 工业与燃煤污染 淘汰燃煤锅炉,升级钢铁/水泥行业超低排放
    高CO 移动源污染 推广电动车,限制柴油车进城
    低达标天数 臭氧(O₃)污染 控制VOCs排放(石化、印刷行业)

    3.2.3.2 区域协同

    • 京津冀:建立PM2.5与CO协同控制机制

    • 长三角:重点防控臭氧与PM2.5复合污染

4 变量关系可视化

4.1 案例数据解释与展示

  • 本数据来自《2023年8

    -17日主要城市空气质量情况》,原始数据文件由生态环境部或权威平

    台发布,包含中国多个城市的空气质量监测数据。

    ✅ 变量含义:

    • City:城市名称(中英文并列)

    • SO2:二氧化硫年平均浓度(μg/m³)

    • NO2:二氧化氮年平均浓度(μg/m³)

    • PM10:可吸入颗粒物年平均浓度(μg/m³)

    • CO:一氧化碳 95 百分位浓度(mg/m³)

    • O3:臭氧日最大8小时90百分位浓度(μg/m³)

    • PM2.5:细颗粒物年平均浓度(μg/m³)

    • AQ_Days:空气质量达标(优良)天数(单位:天)

df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  ) 
data <- df
DT::datatable(data)

4.2 图形3——箱线图

# 加载必要库

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

# 读取并提取数据
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  ) 

# 整理为长格式以适应 ggplot2
df_long <- pivot_longer(
  df,
  cols = c(PM2.5, PM10, NO2, O3),
  names_to = "Pollutant",
  values_to = "Concentration"
)

# 转换为数值型
df_long$Concentration <- as.numeric(df_long$Concentration)

# 绘制箱线图
ggplot(df_long, aes(x = Pollutant, y = Concentration, fill = Pollutant)) +
  geom_boxplot() +
  theme_minimal() +
  labs(
    title = "四类污染物浓度箱线图",
    x = "污染物",
    y = "浓度 (μg/m³)"
  ) +
  theme(legend.position = "none")

  • 图形解读:

  • 4.2.1 1. 污染特征诊断

    4.2.1.1 (1) 颗粒物污染(PM2.5/PM10)

    • 箱体高度对比:PM10箱体范围是PM2.5的1.8倍,表明粗颗粒物浓度受地域影响更大

    • 典型城市

      • 上离群值:石家庄(PM2.5>75)、乌鲁木齐(PM10>150)

      • 低值:海口(PM2.5<20)、拉萨(PM10<30)

    4.2.1.2 (2) 气态污染物(NO₂/O₃)

    • NO₂:箱体紧凑但存在离散高点(如北京、上海),反映机动车排放集中影响

    • O₃:上须线延伸至200+,提示光化学污染热点(如广州夏季O₃可达250μg/m³)

    4.2.2 2. 治理建议

    4.2.2.1 优先级排序

    1. PM2.5超标城市(箱体上须超出国标)

      • 重点区域:京津冀及周边”2+26”城市

      • 措施:燃煤锅炉超低排放改造 + 钢铁行业限产

    2. O₃潜在风险区(上离群值城市)

      • 重点区域:长三角、珠三角

      • 措施:VOCs源头替代(油墨/涂料水性化) + NOx协同控制

    3. 扬尘突出城市(PM10箱体上端)

      • 措施:施工工地”六个100%“管控 + 道路机械化清扫

5 样本相似性可视化

5.1 案例数据解释与展示

  • 本数据来自《2023年8

    -17日主要城市空气质量情况》,原始数据文件由生态环境部或权威平

    台发布,包含中国多个城市的空气质量监测数据。

    ✅ 变量含义:

    • City:城市名称(中英文并列)

    • SO2:二氧化硫年平均浓度(μg/m³)

    • NO2:二氧化氮年平均浓度(μg/m³)

    • PM10:可吸入颗粒物年平均浓度(μg/m³)

    • CO:一氧化碳 95 百分位浓度(mg/m³)

    • O3:臭氧日最大8小时90百分位浓度(μg/m³)

    • PM2.5:细颗粒物年平均浓度(μg/m³)

    • AQ_Days:空气质量达标(优良)天数(单位:天)

df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    SO2 = 3,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  )
data <- df
DT::datatable(data)

5.2 图形4——热力图

library(readxl)
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)

# 1. 数据读取与清洗(关键修复)
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    SO2 = 3,
    NO2 = 4,
    PM10 = 5,
    O3 = 7,
    PM2.5 = 8
  ) |>
  mutate(
    across(c(SO2, NO2, PM10, O3, PM2.5), ~ as.numeric(gsub("[^0-9.]", "", .)))  # 清除特殊字符并转为数值
  )

# 2. 检查数据
print(str(df))  # 确认所有浓度列为numeric
tibble [31 × 6] (S3: tbl_df/tbl/data.frame)
 $ City : chr [1:31] "Beijing" "Tianjin" "Shijiazhuang" "Taiyuan" ...
 $ SO2  : num [1:31] 3 8 7 11 11 14 9 11 7 6 ...
 $ NO2  : num [1:31] 26 35 32 40 33 32 29 29 31 27 ...
 $ PM10 : num [1:31] 61 74 78 78 62 59 53 59 48 52 ...
 $ O3   : num [1:31] 175 190 184 178 148 155 132 121 158 170 ...
 $ PM2.5: num [1:31] 32 41 44 41 29 33 32 36 28 29 ...
NULL
print(summary(df))  # 检查数值范围是否合理
     City                SO2              NO2             PM10      
 Length:31          Min.   : 3.000   Min.   :11.00   Min.   :21.00  
 Class :character   1st Qu.: 6.000   1st Qu.:26.00   1st Qu.:49.50  
 Mode  :character   Median : 8.000   Median :29.00   Median :59.00  
                    Mean   : 8.194   Mean   :28.61   Mean   :57.42  
                    3rd Qu.: 9.000   3rd Qu.:33.00   3rd Qu.:72.00  
                    Max.   :17.000   Max.   :41.00   Max.   :81.00  
       O3            PM2.5      
 Min.   :116.0   Min.   :10.00  
 1st Qu.:138.0   1st Qu.:28.50  
 Median :156.0   Median :33.00  
 Mean   :154.3   Mean   :32.84  
 3rd Qu.:169.0   3rd Qu.:38.00  
 Max.   :193.0   Max.   :55.00  
# 3. 转换为长格式
df_long <- pivot_longer(
  df,
  cols = c(SO2, NO2, PM10, O3, PM2.5),
  names_to = "Pollutant",
  values_to = "Concentration"
)

# 4. 热力图绘制
ggplot(df_long, aes(x = Pollutant, y = reorder(City, -Concentration, FUN = median), 
                  fill = Concentration)) +
  geom_tile(color = "white", linewidth = 0.5) +
  scale_fill_gradientn(
    colors = c("#F7FBFF", "#9ECAE1", "#4292C6", "#084594"),  # 蓝白渐变色系
    na.value = "grey90",
    name = "浓度 (μg/m³)",
    limits = c(0, max(df_long$Concentration, na.rm = TRUE))  # 统一颜色标尺
  ) +
  labs(
    title = "城市污染物浓度热力图",
    subtitle = "颜色深度表示污染程度",
    x = "污染物类型",
    y = "城市(按PM2.5中位数排序)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, face = "bold"),
    axis.text.y = element_text(size = 8),
    plot.title = element_text(hjust = 0.5, face = "bold"),
    panel.grid = element_blank(),
    legend.position = "right",
    legend.key.height = unit(1.5, "cm")
  ) +
  coord_fixed(ratio = 0.8)  # 调整单元格长宽比

  • 图形解读:

  • 5.2.0.1 1污染等级判定(参考色标)

    颜色深度 浓度范围 (μg/m³) 污染等级 典型城市
    浅蓝 (#F7FBFF) 0-50 优良 海口、拉萨
    中蓝 (#9ECAE1) 50-100 轻度污染 南京、杭州
    深蓝 (#4292C6) 100-150 中重度污染 北京、石家庄
    极深 (#084594) >150 严重污染 (当前图像未显示该区间)

    5.2.0.2 关键发现

    1. PM2.5主导性:几乎所有城市在PM2.5列的颜色均深于其他污染物列

    2. SO₂控制良好:多数城市SO₂列呈现浅蓝色,反映燃煤治理成效

    3. 南北差异

      • 北方:PM2.5/PM10深色集中(燃煤+扬尘)

      • 南方:O₃/NO₂色块较深(高温高湿光化学反应)

        1. 政策启示

          1. 重点区域

            • 京津冀:需强化PM2.5与PM10协同控制(燃煤+扬尘)

            • 长三角:重点防控O₃-NO₂耦合污染(VOCs减排)

6 时间序列可视化

6.1 案例数据解释与展示

  • 本数据来自《2023年8

    -17日主要城市空气质量情况》,原始数据文件由生态环境部或权威平

    台发布,包含中国多个城市的空气质量监测数据。

    ✅ 变量含义:

    • City:城市名称(中英文并列)

    • SO2:二氧化硫年平均浓度(μg/m³)

    • NO2:二氧化氮年平均浓度(μg/m³)

    • PM10:可吸入颗粒物年平均浓度(μg/m³)

    • CO:一氧化碳 95 百分位浓度(mg/m³)

    • O3:臭氧日最大8小时90百分位浓度(μg/m³)

    • PM2.5:细颗粒物年平均浓度(μg/m³)

    • AQ_Days:空气质量达标(优良)天数(单位:天)

# 读取数据
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    PM2.5 = 8
  )
data <- df
DT::datatable(data)

6.2 图形5——条形图

library(ggplot2)
library(readxl)
library(dplyr)

# 读取数据
df <- read_excel("E:/r/城市污染量.xlsx", sheet = "1", skip = 2) |>
  select(
    City = 2,
    PM2.5 = 8
  )

# 将 PM2.5 转为数值
df$`PM2.5` <- as.numeric(df$`PM2.5`)

# 按 PM2.5 浓度排序
df <- df %>% arrange(desc(`PM2.5`))

# 绘制条形图
ggplot(df, aes(x = reorder(City, `PM2.5`), y = `PM2.5`, fill = City)) +
  geom_bar(stat = "identity") +
  coord_flip() +  # 横向条形图更适合城市名称展示
  theme_minimal() +
  labs(
    title = "不同城市 PM2.5 年平均浓度比较",
    x = "城市",
    y = "PM2.5 浓度 (μg/m³)"
  ) +
  theme(legend.position = "none")

  • 图形解读:

6.2.1 1. 数据分布特征

6.2.1.1 浓度区间分析

  • 严重污染(>75μg/m³):未显示明显案例(图表X轴截止于40μg/m³,可能存在数据截断)

  • 超标城市(>35μg/m³):石家庄、太原、天津等北方工业城市可能位于右侧

  • 优良城市(<20μg/m³):海口、拉萨等位于最左侧

6.2.1.2 排序逻辑

  • 城市按PM2.5浓度降序排列(污染最重在上方)

  • 可见阶梯式递减趋势,反映地理气候影响:

    • 北方城市(石家庄→沈阳):燃煤供暖+工业排放

    • 中部城市(武汉→重庆):盆地地形不利扩散

    • 沿海城市(广州→海口):海洋调节作用明显

6.2.2 2. 关键城市解析

城市类型 代表城市 PM2.5特征值 主要成因
工业重镇 石家庄 可能接近40μg/m³ 钢铁/水泥产业集中
交通枢纽 天津 35-40μg/m³ 港口物流+机动车排放
盆地城市 重庆 30-35μg/m³ 地形静稳+高湿度二次转化
清洁标杆 海口 可能<15μg/m³ 无工业+强海风扩散