数据可视化期末报告

Author

221527110陈艺印

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 这份数据呈现了 20 个国内城市的城市绿化覆盖面积和城市公园个数信息,涵盖北京、上海等不同城市,两类数据反映各地绿化建设在覆盖规模上的不同成果,体现城市间公园数量布局的差异 ,可用于城市生态对比、规划参考及相关研究 。
library(data.table)
library(DT)
library(ggplot2)

data <- fread("F:/数据可视化/期末报告/城市绿化.csv") 
datatable(data,rownames = FALSE)

2.2 图形1——单变量条形图(添加标签)

library(RColorBrewer)
library(ggplot2)


# 准备颜色向量
color_values <- colorRampPalette(brewer.pal(3, "Set2"))(nrow(data))

# 绘制条形图
palette<-RColorBrewer::brewer.pal(3,"Set2")         # 设置调色板

p1<-ggplot(data,aes(x=城市,y=城市绿化覆盖面积))+
  geom_bar(stat="identity",width=0.8,fill="#66C2A5")+ # 设置统计变换和填充颜色
  geom_text(aes(label=城市绿化覆盖面积,vjust=-0.5))+            # 垂直调整标签位置
  ylim(0,1.1*max(data$城市绿化覆盖面积))+                         # 设置y轴范围
  ggtitle("(a) 城市绿化覆盖面积")

p2<-ggplot(data,aes(x=城市,y=城市绿化覆盖面积))+
  geom_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) 城市绿化覆盖面积与公园个数对比")

gridExtra::grid.arrange(p1,p2,ncol=2)                # 按2列组合图形

  • 图形解读:

  • 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)


data2<-read.csv("F:/数据可视化/期末报告/废水中主要污染物排放量2.csv")
options(DT.options = list(pageLength = 6))
DT::datatable(data2,rownames = FALSE)
# 处理数据
df2<-data2 |> select(-时间) |> 
  gather(everything(),key=指标,value=指标值) |> 
  mutate(指标 = fct_inorder(指标)) |> 
  group_by(指标) |> 
  mutate(标准化值 = scale(指标值)) |> 
  ungroup()

3.2 图形2——箱线图及其变换

palette <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728")  # 长度必须匹配类别数


# 绘制箱线图
p1<-ggplot(df2,aes(x=指标,y=log10(指标值)))+     # y值取对数
  geom_boxplot(fill=palette,outlier.size=0.8)+  # 设置填充颜色和离群点大小
  scale_x_discrete(guide=guide_axis(n.dodge=2))+  # x轴标签为2行
  ylab("对数值")+ggtitle("(a) 对数变换")


p2<-ggplot(df2,aes(x=指标,y=标准化值))+
  geom_boxplot(fill=palette,outlier.size=0.8)+  # 设置填充颜色和离群点大小
  scale_x_discrete(guide=guide_axis(n.dodge=2))+
ggtitle("(b) 标准化变换")

gridExtra::grid.arrange(p1,p2,ncol=2)  

  • 图形解读:

  • (a)对数变换箱线图

    纵轴数据经对数转换,用于压缩极端值、让分布更 “规整”。

    不同污染物对数变换后分布差异大, 比如 “废水化学需氧量排放量” 整体对数数值偏高且集中,“废水中石油类排放量” 对数数值低、离散度相对大(箱子长、离群点多 )。

  • (b)标准化变换箱线图

    纵轴(标准化值)数据经标准化,让不同量纲 / 均值的指标可对比,均值为 0、标准差为 1。

    “废水中氨氮排放量” 标准化后离散度最大,说明原始数据波动相对突出;

    “废水化学需氧量排放量” 相对集中(箱子短),波动小;

    可横向对比不同污染物标准化后的分布形态,判断哪些指标原始数据 “波动更异常” 。

4 变量关系可视化

4.1 案例数据解释与展示

  • 原始数据data3Age(年龄)、Diabetes(是否患糖尿病)、BMI(身体质量指数)、Glucose(血糖)、Pressure(血压)、Pregnant(怀孕次数)

  • 将Age,BMI提取出来保存为df3

data3 <- fread("F:/数据可视化/期末报告/diabetes3.csv") 
df3 <- data3 |>  select(Age,BMI) 

datatable(df3,rownames = FALSE)

4.2 图形3——二维直方图和密度图

library(viridis)     # 色盲友好的颜色配色包

p<-ggplot(df3,aes(x=Age,y=BMI))+                       # 绘制散点图
    theme_bw()+                                   # 使用黑白主题
    theme(panel.grid=element_blank())             # 移除网格线

p1<-p+geom_hex(bins=20, linewidth = 0.3,color="black")+   # 六边形分箱
    scale_fill_viridis_c(option="H")+             # 选择配色方案
    ggtitle("(a) 六边形分箱散点图")

p2<-p+stat_density_2d(geom="raster",aes(fill=after_stat(density)),contour=FALSE)+ # 绘制二维核密度图
    scale_fill_viridis_c(option="H")+
    ggtitle("(b) 二维核密度图")

p3<-p+geom_point(color="grey20")+                 # 绘制散点图
    geom_density_2d()+                            # 添加等高线
    ggtitle("(c) 散点图+密度等高线")

p4<-p+geom_point(color="grey20")+
    geom_density_2d_filled(alpha=0.8)+
    geom_density_2d(size=0.25,colour="black")+    # 设置等高线宽度和颜色
    guides(fill="none")+                          # 删除图例
    ggtitle("(d) 散点图+密度等高线带")

 gridExtra::grid.arrange(p1,p3,p2,p4,ncol=2)      # 组合图形

  • 图形解读:从 4 张图能看出一致的规律:
    1. 集中区域

      • 年龄(Age)在 20-50 岁、BMI 在 20-40 区间,数据最密集(六边形图颜色深、核密度图亮、等高线密集)。

      • 说明这个年龄段 + BMI 范围的样本最多,是数据的 “主体区间”。

    2. 离散趋势

      • 年龄 > 50 岁后,BMI 的离散度变大(六边形图颜色变浅、核密度图变暗、等高线变稀疏)。

      • 说明高龄人群的 BMI 分布更分散,个体差异大(可能受健康、生活习惯等因素影响)。

    3. 异常点

      • 六边形图(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女性及中老年男性尤为高危,需结合临床指标进一步验证糖尿病风险。

df4<-data3 %>%
  select(Age,BMI,Glucose,Pressure,Pregnant)%>%
  slice(1:33)

datatable(df4,rownames = FALSE)

5.2 图形4——星图

mat<-df4%>%as.matrix() # 转换成矩阵
rownames(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) 

data5 <- fread("F:/数据可视化/期末报告/pinganstockRDP5.csv") 
datatable(data5,rownames = FALSE)
d1 <- data5 |> filter(year(日期)==2018) |> select(日期,RDP5:RDP)
ma <- d1[,-1] |> ma(order=30,centre=TRUE)   
colnames(ma)<-c('maRDP5','maRDP10','maRDP15','maRDP20','maEMA15','maRDP')      # 重新命名列名称
df5<-d1 |> gather(2:7,key="指标",value="指标值")
df6<-ma |> as.data.frame() |> gather(1:6,key="ma指标",value="ma指标值")
df8<-cbind(df5,df6) 

6.2 图形5——随机成分平滑曲线分面图

df8$日期 <- as.Date(df8$日期)
ggplot(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 周期)内的动态变化,可辅助判断波动规律与异常点。