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)数据可视化期末报告
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:空气质量达标(优良)天数(单位:天)
注:各项浓度值均为年平均或年度统计值,单位已标准化。 ")
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. 政策建议
京津冀地区
重点控制燃煤和工业排放(降低PM2.5/SO₂)
加强区域联防联控
长三角/珠三角
优化交通结构(减少NOx排放)
实施VOCs源头替代
通用措施
建立污染过程预警机制(尤其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 优先级排序
PM2.5超标城市(箱体上须超出国标)
重点区域:京津冀及周边”2+26”城市
措施:燃煤锅炉超低排放改造 + 钢铁行业限产
O₃潜在风险区(上离群值城市)
重点区域:长三角、珠三角
措施:VOCs源头替代(油墨/涂料水性化) + NOx协同控制
扬尘突出城市(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)) # 确认所有浓度列为numerictibble [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 关键发现
PM2.5主导性:几乎所有城市在PM2.5列的颜色均深于其他污染物列
SO₂控制良好:多数城市SO₂列呈现浅蓝色,反映燃煤治理成效
南北差异:
北方:PM2.5/PM10深色集中(燃煤+扬尘)
南方:O₃/NO₂色块较深(高温高湿光化学反应)
政策启示
重点区域:
京津冀:需强化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³ | 无工业+强海风扩散 |