library(data.table)
library(DT)
library(ggplot2)
<- fread("F:/数据可视化/期末报告/城市绿化.csv")
data datatable(data,rownames = FALSE)
数据可视化期末报告
1 报告要求
期末实验报告由5章节5个图形组成,每个章节需要作一个图形。
每个章节选择作什么图自主选择,作图前补充完整图形标题名称,例如:图形1——多变量条形图。
案例数据自主收集,不同章节可以公用一个数据集。但同学间不允许使用相同数据集。
每个章节的数据集合需要通过
datatable
函数展示,并简要解释数据来源和变量意义。每个输出图形后需要对图形作简要解读,最少需针对图形提出一个观点。
渲染html文件保留代码展示,6月22日前将发布网址提交至共享文档
“8、期末报告”
列中。评分标准:
每章节图形各20分
能有效输出图形和合理解释75%
数据独特性强10%
图形个性化强15%
2 类别数据可视化
2.1 案例数据解释与展示
- 这份数据呈现了 20 个国内城市的城市绿化覆盖面积和城市公园个数信息,涵盖北京、上海等不同城市,两类数据反映各地绿化建设在覆盖规模上的不同成果,体现城市间公园数量布局的差异 ,可用于城市生态对比、规划参考及相关研究 。
2.2 图形1——单变量条形图(添加标签)
library(RColorBrewer)
library(ggplot2)
# 准备颜色向量
<- colorRampPalette(brewer.pal(3, "Set2"))(nrow(data))
color_values
# 绘制条形图
<-RColorBrewer::brewer.pal(3,"Set2") # 设置调色板
palette
<-ggplot(data,aes(x=城市,y=城市绿化覆盖面积))+
p1geom_bar(stat="identity",width=0.8,fill="#66C2A5")+ # 设置统计变换和填充颜色
geom_text(aes(label=城市绿化覆盖面积,vjust=-0.5))+ # 垂直调整标签位置
ylim(0,1.1*max(data$城市绿化覆盖面积))+ # 设置y轴范围
ggtitle("(a) 城市绿化覆盖面积")
<-ggplot(data,aes(x=城市,y=城市绿化覆盖面积))+
p2geom_col(width=0.8,fill=color_values)+
geom_text(aes(label=paste(format(城市绿化覆盖面积))),vjust=-0.5)+
geom_text(aes(label=paste(format(城市公园个数,nsmall=1))),vjust=1.5)+
ylim(0,1.1*max(data$城市绿化覆盖面积))+ # 设置y轴范围
ggtitle("(b) 城市绿化覆盖面积与公园个数对比")
::grid.arrange(p1,p2,ncol=2) # 按2列组合图形 gridExtra
图形解读:
p1:城市绿化覆盖面积
单独呈现各城市绿化覆盖面积。不同城市差异显著,像南宁(178186 )、北京(158649 )绿化覆盖面积突出;部分城市如泸州(4414 )、柳州(9300 )等相对偏小,反映城市绿化资源基础不同。
p2:城市绿化覆盖面积与公园个数对比
内容:在绿化覆盖面积基础上,叠加公园个数数据(位于绿化覆盖面积下),可关联绿化规模与公园数量关系。
绿化面积大的城市,公园个数不一定同比例高,如南宁绿化面积大(178186 ),公园个数 473 ;北京绿化面积 158649 ,公园个数 530 ,二者公园数差距小于绿化面积差距。部分城市绿化面积相近但公园数不同,如锦州(9008 )公园数 612 ,福州(60268 )公园数 127 ,体现绿化布局、公园建设策略差异,有的靠大规模绿地,有的靠分散公园补充绿化。
3 数据分布可视化
3.1 案例数据解释与展示
读入data2:是原始监测数据,记录 2012 - 2022 年(18年缺失)的4 类废水污染物排放量。
有4类指标,分别为:化学需氧量、氨氮、总氮、石油类排放量,数值差异较大
将数据标准化处理后得到df2: “指标” 列对应 data2 的污染物类型,“指标值” 是原始排放量,“标准化值” 是转换后的结果(均值为 0、标准差为 1 )。
library(dplyr)
library(tidyr)
library(forcats)
<-read.csv("F:/数据可视化/期末报告/废水中主要污染物排放量2.csv")
data2options(DT.options = list(pageLength = 6))
::datatable(data2,rownames = FALSE) DT
# 处理数据
<-data2 |> select(-时间) |>
df2gather(everything(),key=指标,value=指标值) |>
mutate(指标 = fct_inorder(指标)) |>
group_by(指标) |>
mutate(标准化值 = scale(指标值)) |>
ungroup()
3.2 图形2——箱线图及其变换
<- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728") # 长度必须匹配类别数
palette
# 绘制箱线图
<-ggplot(df2,aes(x=指标,y=log10(指标值)))+ # y值取对数
p1geom_boxplot(fill=palette,outlier.size=0.8)+ # 设置填充颜色和离群点大小
scale_x_discrete(guide=guide_axis(n.dodge=2))+ # x轴标签为2行
ylab("对数值")+ggtitle("(a) 对数变换")
<-ggplot(df2,aes(x=指标,y=标准化值))+
p2geom_boxplot(fill=palette,outlier.size=0.8)+ # 设置填充颜色和离群点大小
scale_x_discrete(guide=guide_axis(n.dodge=2))+
ggtitle("(b) 标准化变换")
::grid.arrange(p1,p2,ncol=2) gridExtra
图形解读:
(a)对数变换箱线图
纵轴数据经对数转换,用于压缩极端值、让分布更 “规整”。
不同污染物对数变换后分布差异大, 比如 “废水化学需氧量排放量” 整体对数数值偏高且集中,“废水中石油类排放量” 对数数值低、离散度相对大(箱子长、离群点多 )。
(b)标准化变换箱线图
纵轴(标准化值)数据经标准化,让不同量纲 / 均值的指标可对比,均值为 0、标准差为 1。
“废水中氨氮排放量” 标准化后离散度最大,说明原始数据波动相对突出;
“废水化学需氧量排放量” 相对集中(箱子短),波动小;
可横向对比不同污染物标准化后的分布形态,判断哪些指标原始数据 “波动更异常” 。
4 变量关系可视化
4.1 案例数据解释与展示
原始数据data3:
Age
(年龄)、Diabetes
(是否患糖尿病)、BMI
(身体质量指数)、Glucose
(血糖)、Pressure
(血压)、Pregnant
(怀孕次数)将Age,BMI提取出来保存为df3
<- fread("F:/数据可视化/期末报告/diabetes3.csv")
data3 <- data3 |> select(Age,BMI)
df3
datatable(df3,rownames = FALSE)
4.2 图形3——二维直方图和密度图
library(viridis) # 色盲友好的颜色配色包
<-ggplot(df3,aes(x=Age,y=BMI))+ # 绘制散点图
ptheme_bw()+ # 使用黑白主题
theme(panel.grid=element_blank()) # 移除网格线
<-p+geom_hex(bins=20, linewidth = 0.3,color="black")+ # 六边形分箱
p1scale_fill_viridis_c(option="H")+ # 选择配色方案
ggtitle("(a) 六边形分箱散点图")
<-p+stat_density_2d(geom="raster",aes(fill=after_stat(density)),contour=FALSE)+ # 绘制二维核密度图
p2scale_fill_viridis_c(option="H")+
ggtitle("(b) 二维核密度图")
<-p+geom_point(color="grey20")+ # 绘制散点图
p3geom_density_2d()+ # 添加等高线
ggtitle("(c) 散点图+密度等高线")
<-p+geom_point(color="grey20")+
p4geom_density_2d_filled(alpha=0.8)+
geom_density_2d(size=0.25,colour="black")+ # 设置等高线宽度和颜色
guides(fill="none")+ # 删除图例
ggtitle("(d) 散点图+密度等高线带")
::grid.arrange(p1,p3,p2,p4,ncol=2) # 组合图形 gridExtra
- 图形解读:从 4 张图能看出一致的规律:
集中区域:
年龄(Age)在 20-50 岁、BMI 在 20-40 区间,数据最密集(六边形图颜色深、核密度图亮、等高线密集)。
说明这个年龄段 + BMI 范围的样本最多,是数据的 “主体区间”。
离散趋势:
年龄 > 50 岁后,BMI 的离散度变大(六边形图颜色变浅、核密度图变暗、等高线变稀疏)。
说明高龄人群的 BMI 分布更分散,个体差异大(可能受健康、生活习惯等因素影响)。
异常点:
- 六边形图(a)和散点图(c、d)中,能看到少量 “孤立点”(比如 Age>60、BMI>60 的点 ),属于极端值(需结合业务判断是否为异常,比如是否是真实高 BMI 样本)。
5 样本相似性可视化
5.1 案例数据解释与展示
关键变量: Age(年龄):22-60岁(青年至中年); BMI:19.9-45.8(从偏瘦到严重肥胖 ; Glucose(血糖):78-197 mg/dL ; Pressure(血压):30-94 mmHg ; Pregnant(怀孕次数):0-13次
包含33个样本量,数据揭示肥胖人群中普遍存在血糖、血压异常,其中多次妊娠的高BMI女性及中老年男性尤为高危,需结合临床指标进一步验证糖尿病风险。
<-data3 %>%
df4select(Age,BMI,Glucose,Pressure,Pregnant)%>%
slice(1:33)
datatable(df4,rownames = FALSE)
5.2 图形4——星图
<-df4%>%as.matrix() # 转换成矩阵
matrownames(mat) <- df4$ID # 设置矩阵行名称
stars(mat,
full=TRUE, # 绘制出满圆
scale=TRUE, # 将数据缩放到[0,1]的范围
nrow=5, # 5行布局
len=1, # 设置半径或线段长度的比例
frame.plot=TRUE, # 添加边框
draw.segments=TRUE,key.loc=c(13.5,2,5), # 绘制圆弧图,并设置位置
mar=c(0.5,0.1,0.1,0.1), # 设置图形边界
cex=0.6) # 设置标签字体大小
- 图形解读:
- 黑色扇形 →
Age
(年龄) - 红色扇形 →
BMI
(身体质量指数) - 绿色扇形 →
Glucose
(血糖) - 蓝色扇形 →
Pressure
(血压) - 青色扇形 →
Pregnant
(怀孕次数,仅对女性样本有意义,男性 / 未孕女性可能占比小)
- 每个扇形的面积大小对应指标的 “数值大小”。数值越大,扇形占比可能越大 。图形弱化精确数值,强化 “差异的直观感受”,适合快速抓住差异。
6 时间序列可视化
6.1 案例数据解释与展示
- 该数据集记录了2017年11月至2019年4月间6项技术指标(RDP5/10/15/20、EMA15、综合RDP)的每日数值,主要特征有:1.多周期指标组合(5/10/15/20日)反映短期到中长期趋势强度。2.EMA15作为平滑指标验证中期趋势。3.综合RDP可能为加权均值
library(forecast)
<- fread("F:/数据可视化/期末报告/pinganstockRDP5.csv")
data5 datatable(data5,rownames = FALSE)
<- data5 |> filter(year(日期)==2018) |> select(日期,RDP5:RDP)
d1 <- d1[,-1] |> ma(order=30,centre=TRUE)
ma colnames(ma)<-c('maRDP5','maRDP10','maRDP15','maRDP20','maEMA15','maRDP') # 重新命名列名称
<-d1 |> gather(2:7,key="指标",value="指标值")
df5<-ma |> as.data.frame() |> gather(1:6,key="ma指标",value="ma指标值")
df6<-cbind(df5,df6) df8
6.2 图形5——随机成分平滑曲线分面图
$日期 <- as.Date(df8$日期)
df8ggplot(df8,aes(x=日期,y=指标值,color=指标))+geom_line(size=0.2)+# 绘制折线图
geom_line(aes(y=ma指标值,color=ma指标),size=0.8)+# 绘制折线图
scale_x_date(expand=c(0,0),date_breaks="2 month",date_labels="%b")+
guides(color="none")+
facet_wrap(~指标,ncol=3,scale="free") # 按指标分面,单独设置各分面图的y轴刻度
- 图形解读:
以 EMA15为例:
横轴是 3 - 11 月,纵轴是指标值(-5 到 5 波动 )。图中橙色折线是 EMA15 平滑值,红色细线是原始数据。能看到:指标波动剧烈,3 月、7 - 9 月有明显冲高;
EMA 平滑后,趋势更清晰(过滤短期噪声 );
反映该指标在短期(15 周期)内的动态变化,可辅助判断波动规律与异常点。