数据可视化期末报告

Author

马嘉祺221527131

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 变量:日期,货币代码,期初价,期末价,最高价,最低价,期平均,累计平均
library(dplyr)
library(DT)
library(tidyr)
library(forcats)
library(readxl)
data <- read_excel("FE_Exratema.xlsx")
head(data)
# A tibble: 6 × 8
  日期    货币代码 期初价 期末价 最高价 最低价 期平均 累计平均
  <chr>   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>    <dbl>
1 1994-00 HKD      113.   109.   113.   109.   112.     112.  
2 1994-00 JPY        7.78   8.51   8.88   7.72   8.43     8.43
3 1994-00 USD      870    845.   871    845.   862.     862.  
4 1994-01 HKD      113.   113.   113.   113.   113.     113.  
5 1994-01 JPY        7.78   7.92   8.01   7.72   7.80     7.80
6 1994-01 USD      870    870    871    869    870      870   
DT::datatable(head(data), rownames = FALSE)

2.2 图形1——单变量条形图

layout(matrix(c(1,2,3,3),2,2,byrow=TRUE))   # 页面布局
par(mai=c(0.3, 0.5, 0.2, 0.2),cex=0.3,cex.main=1,font.main=1,font.main=1)   # 设置图形边距和字体大小等

table(data$货币代码) |> barplot(xlab="期平均",ylab="货币代码",
   horiz=T,                              # 水平排放各条
   density=30,angle=0,                      # 设置填充密度和密度线的角度
   col=c("grey80","grey50","grey30"),border="blue",  # 设置颜色向量
   main="(a) 水平条形图")                   # 添加标题

table(data$货币代码)|> barplot(xlab="货币代码",ylab="期初价",density=20,angle=90,
  col=2:4,border="red",main="(b) 垂直条形图")    

table(data$货币代码) |> barplot(xlab="货币代码",ylab="期末价",cex.names=1.2,cex.lab=1.2,
  col=c("#DE2D26","#31A354","#3182BD"),
  main="(c) 垂直条形图")  # 绘制满意度的条形

  • 图形解读:

    显示不同货币与基准货币(如 USD)的汇率或价值,长度差异反映显著变化。

    比较货币对(如 AUD/USD, EUR/USD)的某种指标(如交易量或波动性),部分对值较高。

3 数据分布可视化

3.1 案例数据解释与展示

DT::datatable(head(data), rownames = FALSE)

3.2 图形2——直方图

library(gridExtra)
library(e1071)        # 用于计算偏度系数和峰度系数
library(ggplot2)

df <- data
mytheme<-theme(plot.title=element_text(size="12"), # 设置主标题字体大小
   axis.title=element_text(size=10),               # 设置坐标轴标签字体大小
   axis.text=element_text(size=9),                # 设置坐标轴刻度字体大小
   legend.text=element_text(size="8"))            # 设置图例字体大小
# 作初始直方图,纵轴默认为频数
h1<-ggplot(data=df,aes(x=累计平均))+mytheme+    # 绘制直方图
  geom_histogram(fill="lightgreen",color="gray50")

# 图(a) 添加地毯图、偏度系数和峰度系数
p1<-h1+geom_rug(size=0.2,color="blue3")+    # 添加地毯图,须线的宽度为0.2
  annotate("text",x=1300,y=500,label="偏度系数 =",size=2)+  # 添加注释文本
  annotate("text",x=1500,y=500,label=round(skewness(df$累计平均),4),size=2)+  # 添加偏度系数
  annotate("text",x=1300,y=430,label="峰度系数 =",size=2)+  # 添加注释文本
  annotate("text",x=1500,y=430,label=round(kurtosis(df$累计平均),4),size=2)+  # 添加峰度系数
  ylab("count")+ggtitle("(a) 添加地毯图和偏度与峰度系数")

# 图(b)添加频数多边形中位数点
p2<-h1+geom_freqpoly(color="red3")+
  geom_point(x=median(df$累计平均),y=0,shape=21,size=4,fill="yellow")+# 添加中位数点
  annotate("text",x=median(df$累计平均),y=4.2,label="中位数",size=3,color="red3")+ # 添加注释文本
  ggtitle("(b) 添加频数多边形和中位数点")

# 将直方图的纵轴转为密度
h2<-ggplot(data=df,aes(x=累计平均))+mytheme+      
  geom_histogram(aes(y=..density..),fill="lightgreen",color="gray50")
# 图(c) 添加核密度曲线
p3<-h2+geom_density(color="blue2",size=0.7)+ # 添加核密度曲线
  annotate("segment",x=1300,xend=1000,y=0.006,yend=0.001,color="blue",size=0.6,arrow=arrow(angle=15,length=unit(0.1,"inches")))+  # 添加带箭头的线
  annotate("text",x=1400,y=0.0015,label="核密度曲线",size=2)+ # 添加注释文本
   ggtitle("(c) 添加核密度曲线")

# 图(d) 添加理论正态曲线和均值线
p4<-h2+stat_function(fun=dnorm,args=list(mean=mean(df$`累计平均`),sd=sd(df$`累计平均`)),
       linetype="twodash",color="red2",size=0.8)+ # 添加理论正态分布曲线
  geom_vline(xintercept=mean(df$`累计平均`),linetype="twodash",size=0.6,color="red")+          # 添加均值垂线,并设置线形、线宽和颜色
  annotate("text",x=1500,y=0.01,label="均值线",size=3)+  # 添加注释文本
  annotate("text",x=500,y=0.0017,label="理论正态分布曲线",size=2)+  # 添加注释文本
  ggtitle("(d) 添加理论正态曲线和均值线")

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

  • 图形解读:图形(a)-(d)共同显示数据大致对称,但需结合偏度/峰度数值确认。
  • 图(d)中理论曲线与实际密度的吻合程度是关键。若差异显著,可能需要数据转换或非参数方法。

4 变量关系可视化

4.1 案例数据解释与展示

DT::datatable(head(data), rownames = FALSE)

4.2 图形3——散点图

df2<-data
p1<-ggplot(data=df2,aes(x=货币代码,y=累计平均))+
    geom_point(shape=21,size=1.5,fill="deepskyblue")+  # 设置点的形状、大小和填充颜色
    geom_rug(color="steelblue")+               # 添加地毯图
    stat_smooth(method=lm,color="red",fill="blue",size=0.8)+  # 添加线性拟合线、设置线的颜色和置信带的颜色
    geom_point(aes(x=mean(货币代码),y=mean(累计平均)),shape=21,fill="yellow",size=4)+   # 绘制均值点
    ggtitle("(a) 散点图+地毯图+线性拟合")
p2<-ggplot(data=df,aes(x=货币代码,y=累计平均))+
    geom_point(shape=21,size=1.5,fill="deepskyblue")+
    geom_rug(position="jitter",size=0.5,color="deepskyblue")+  # 添加地毯图
    stat_smooth(method=loess,color="red",fill="deepskyblue",size=0.8)+
                                                # 添加局部加权回归拟合线
    geom_point(aes(x=mean(货币代码),y=mean(累计平均)),shape=21,fill="yellow",size=4)+
    ggtitle("(b) 散点图+地毯图+loess拟合")

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

  • 图形解读:
  • 部分货币(如USD、GBP)的累计平均显著高于其他货币(如MYR、RUB),可能存在结构性差异。
  • 相比线性拟合,Loess曲线能更灵活地反映数据波动(如可能在EUR或MYR附近出现拐点)。

5 样本相似性可视化

5.1 案例数据解释与展示

DT::datatable(head(data), rownames = FALSE)

5.2 图形4——雷达图

library(ggiraphExtra)
df3<-filter(data,货币代码%in%c("HKD","JPY","USD","AUD","CAD","EUR","GBP","MYR","NZD","RUB")) #

# 设置图形主题
myangle<-seq(-20,-340,length.out=8)   # 设置标签角度,使之垂直于坐标轴
mytheme<-theme_bw()+                  # 使用黑白主题
   theme(legend.position="bottom",    # 设置图例位置
   axis.text.x=element_text(size=6,color="blue4",angle=myangle))
                                  # 设置坐标轴标签字体大小、颜色和和角度
# 图(a)使用原始数据
p1<-ggRadar(data=df3,aes(group=货币代码), 
  rescale=FALSE,                        # 数据不归一化
  ylim=c(0,20),                   # 设置y轴范围
  alpha=0,                              # 设置颜色透明度
  size=2)+                              # 设置点的大小
  mytheme+xlab("货币代码")+ylab("累计平均")+  # 设置x轴和y轴标签
  ggtitle("(a) 原始数据雷达图") # 添加标题

# 图(b)使用归一化数据
p2<-ggRadar(data=df3,aes(group=货币代码),   
  rescale=TRUE,                         # 数据标准化(缩放到[0,1]范围)
  ylim=c(-0.3,1),                       # 设置y轴范围
  alpha=0.3,                            # 设置颜色透明度
  size=2)+                              # 设置点的大小
  mytheme+xlab("货币代码")+ylab("归一化值")+
  ggtitle("(b) 归一化雷达图") # 添加标题

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

  • 图形解读:展示各货币在多个指标(如汇率、波动性、利率等)上的原始表现,数据范围从 0 到 900。各货币的性能差异明显,EUR 和 HKD 在某些指标上表现较强。

    显示归一化后的数据,范围从 -0.25 到 1.0。归一化后,各货币的相对表现更均衡,EUR 和 HKD 仍占优势,MYR 和 NZD 在某些指标上较弱。

6 时间序列可视化

6.1 案例数据解释与展示

DT::datatable(head(data), rownames = FALSE)

6.2 图形5——地平线图

library(latticeExtra)
dt<-data |> filter(日期>="1994" & 日期<="2025") |> 
  select(-c(日期,累计平均)) |> ts()  # 选择绘图数据并生成时间序列对象
horizonplot(dt,main="latticeExtra 包绘制的地平线图",
  layout=c(1,6),                              # 1列6行的页面布局
  origin=median,
  colorkey=TRUE,                              # 显示色键
  par.settings=list(par.main.text=list(cex=1,font=1)))# 设置主标题字体大小

  • 图形解读:

    • 横轴为时间,纵轴为多个数据系列,颜色表示偏离平均值(origin)的标准差(±1σ, ±2σ, ±3σ)。

    • 蓝色区域(+3σ 至 +1σ)表示高于平均值,红色区域(-1σ 至 -3σ)表示低于平均值。

    • 数据在时间段内波动明显,1000-1500 区间显示较大离散,反映数据波动性增强。图表展示数据随时间的变化,偏离平均值的分布通过颜色编码,1000-1500 段波动最显著。