数据可视化期末报告

Author

221527103纪咏琪

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

library(tidyverse)
library(viridis)  # 用于扩展调色板
library(DT)
library(gridExtra)  
library(RColorBrewer)
library(ggplot2)
library(grDevices)
library(zoo)

2 类别数据可视化

2.1 案例数据解释与展示

  • 该数据源自广东统计年鉴,展示了2023年广东各市的GDP水平。数据比较简单,列名只有市别,经济区域划分,地区生产总值三项。旨在反映广东各市的经济发展差异,以及区域发展差异。
data1<-read.csv("gdp.csv")
DT::datatable(data1)
colnames(data1)
[1] "市别"         "经济区域划分" "各市生产总值"
df_1<-data1|>
  arrange(desc(各市生产总值)) |> 
  mutate(累积百分比 = cumsum(各市生产总值*100/sum(各市生产总值)), #计算累积百分比
         累积百分比 = round(累积百分比,1),        #保留一位小数 
         市别 = fct_inorder(市别)         #按字符出现顺序定义因子水平
         )
df_2<-data1|>
  select(经济区域划分,各市生产总值) |> 
  group_by(经济区域划分) |> 
  summarise(区域生产总值=sum(各市生产总值)) |> 
  arrange(desc(区域生产总值)) |> 
  mutate(累积百分比 = cumsum(区域生产总值*100/sum(区域生产总值)), #计算累积百分比
         累积百分比 = round(累积百分比,1),        #保留一位小数 
         经济区域划分 = fct_inorder(经济区域划分)         #按字符出现顺序定义因子水平
         )
datatable(df_1,rownames = F)
datatable(df_2,rownames = F)

_

2.2 图形1——广东各市帕累托图&广东区域经济帕累托图

palette1 <- colorRampPalette(brewer.pal(11, "GnBu"))(21)
p<-ggplot(df_1)+aes(x=市别,y=各市生产总值)+                
  geom_col(width=0.8,fill = palette1,color="grey50")+# 绘制条形图
  geom_text(aes(x=市别,y=各市生产总值,label=各市生产总值,vjust=-0.5,angle=22),size=2.5,color="gray50")+                      # 添加数值标签,垂直调整标签位置
   #ylab("人数\n(人)")+               # 设置y轴标签
  theme(axis.text.y=element_text(angle=90,hjust=0.5,vjust=0.5))+     # 调整y轴标签角度
  theme(legend.position="none")         # 删除图例
# 绘制折线和点
p1<-p+geom_line(aes(x=as.numeric(市别),y=累积百分比*max(各市生产总值/100)))+     # 绘制累积百分比曲线
  geom_point(aes(x=as.numeric(市别),y=累积百分比*max(各市生产总值/100)),
             size=2,shape=23,fill="yellow")+                     # 绘制点
  geom_text(aes(label=累积百分比,x=市别,y=1*累积百分比*max(各市生产总值/100),
  hjust=0.6,vjust=-0.95),size=3,colour="blue4")+                # 添加百分比数值标签
  scale_y_continuous(sec.axis = sec_axis(~./max(df_1$各市生产总值/100)))# 添加坐标轴
p1+annotate("text",x=21,y=25000,label="百分比(%)",angle=90,size=3.5)+
 annotate("text",x=19.5,y=32000,label="累积百分比曲线",size=3.5)   # 添加注释文本

colors <- terrain.colors(6)
p2<-ggplot(df_2)+aes(x=经济区域划分,y=区域生产总值)+                
  geom_col(width=0.8,fill = colors[c(3,4,5,2)],color="grey50")+# 绘制条形图
  geom_text(aes(x=经济区域划分,y=区域生产总值,label=区域生产总值,vjust=-0.5),size=2.5,color="gray50")+                      # 添加数值标签,垂直调整标签位置
   #ylab("人数\n(人)")+               # 设置y轴标签
  theme(axis.text.y=element_text(angle=90,hjust=0.5,vjust=0.5))+     # 调整y轴标签角度
  theme(legend.position="none")         # 删除图例
# 绘制折线和点
p3<-p2+geom_line(aes(x=as.numeric(经济区域划分),y=累积百分比*max(区域生产总值/100)))+     # 绘制累积百分比曲线
  geom_point(aes(x=as.numeric(经济区域划分),y=累积百分比*max(区域生产总值/100)),
             size=2,shape=23,fill="yellow")+                     # 绘制点
  geom_text(aes(label=累积百分比,x=经济区域划分,y=1*累积百分比*max(区域生产总值/100),
  hjust=0.6,vjust=-0.95),size=3,colour="blue4")+                # 添加百分比数值标签
  scale_y_continuous(sec.axis = sec_axis(~./max(df_2$区域生产总值/100)))# 添加坐标轴
p3+annotate("text",x=4.5,y=80000,label="百分比(%)",angle=90,size=3.5)+
 annotate("text",x=4,y=99000,label="累积百分比曲线",size=3.5)   # 添加注释文本

  • 图形解读:图一发现,深圳,广州的生产总值占比已经高达50%,对于拥有21个城市的省份来说,这个经济发展水平是及其失衡的。从区域经济来看,珠三角地区的gdp贡献达到80%以上,而粤东西北的gdp所占毫末。区域发展呈 “断层式” 差异,需通过政策引导、资源均衡配置推动协同发展 。

3 数据分布可视化

3.1 案例数据解释与展示

  • 本数据集源自IMDb(互联网电影数据库),收录了用户评分最高的1000部电影核心信息。涵盖影片名称Series_Title、上映年份Released_Year、分级证书Certificate、时长Runtime、题材Genre、IMDb用户评分(0-10分)IMDB_Rating、Metacritic专业评分Meta_score以及用户投票数No_of_Votes。数据可用于分析顶级影片特征、评分趋势、类型分布及大众与专业评价关联性。

    关键点解释:

data2<-read.csv("imdb_top_1000.csv")
colnames(data2)
[1] "Series_Title"  "Released_Year" "Certificate"   "Runtime"      
[5] "Genre"         "IMDB_Rating"   "Meta_score"    "No_of_Votes"  
DT::datatable(data2)
df <- data2 |>
  select(IMDB_Rating,Meta_score)|>
  mutate(scale_IMDB_Rating = scale(IMDB_Rating),
         scale_Meta_score = scale(Meta_score))
df <- na.omit(df)

DT::datatable(df,rownames = FALSE)

3.2 图形2——IMDB大众与专家影评分布核密度图

p<-ggplot(df)+aes(x=x)+
   geom_density(aes(x=scale_IMDB_Rating,y=..density..),color="grey50",fill="yellow",alpha=0.3)+ 
   geom_label(aes(x=0.5,y=0.25),label="IMDB_Rating",color="red")+  # 添加标签
   geom_density(aes(x=scale_Meta_score,y=-..density..),color="grey50",fill="green",alpha=0.3)+ 
   geom_label(aes(x=0,y=-0.3),label="Meta_score",color="red")+  # 添加标签
   xlab("指标值")+ggtitle("(b) IMDB_Rating和Meta_score的标准化镜像直方图")
p

  • 图形解读:IMDB_Rating右偏、Metacritic专业评分Meta_score略微左偏。大众评分存在”高分聚集”现象,用户倾向于给好评。专业评分呈现比较对称分布特征。专业评审倾向严格与大众评分的”宽容分散”形成鲜明对比,揭示了艺术评价中专业性与普适性的根本差异。这种差异使Meta_score更适用于质量基准评估,而IMDB_Rating更适合衡量大众接受度。

4 变量关系可视化

4.1 案例数据解释与展示

  • 本数据集包含学生核心信息:年龄(数值型,反映成长阶段)、性别(分类变量,区分生理特征)、每周学习时长(数值型,单位小时,衡量投入程度)及考试成绩(数值型,百分制,核心学业指标)。数据用于学习时长对成绩的影响,和群体差异研究,如不同性别/年龄的学习效率。
data3<-read.csv("basic-student-score.csv")
colnames(data3)
[1] "age"         "gender"      "study_hours" "exam_score" 
DT::datatable(data3)
df1<-data3|>
  select(study_hours,exam_score)
df2<-data3|>
  select(age,exam_score)

4.2 图形3——学习时长与成绩的散点图&学习时长-性别-成绩气泡图

p1<-ggplot(data=df1,aes(x=study_hours,y=exam_score))+
    geom_point(shape=21,size=1.5,fill="deepskyblue")+  # 设置点的形状、大小和填充颜色
    geom_rug(color="steelblue")+               # 添加地毯图
    stat_smooth(method=lm,color="red",fill="purple",size=0.8)+  # 添加线性拟合线、设置线的颜色和置信带的颜色
    geom_point(aes(x=mean(study_hours),y=mean(exam_score)),shape=21,fill="yellow",size=4)+   # 绘制均值点
    ggtitle("(a) 学习时长&考试成绩")

p3<-ggplot(data3,aes(x=study_hours,y=exam_score,color=gender))+
  geom_point(aes(size=exam_score),alpha=0.5)+  
  scale_size(range=c(1,7))+                 # 设置点的大小
  theme(panel.grid.minor=element_blank())+  # 移除次网格线
  theme(plot.title=element_text(size=12))+  # 设置标题字体大小
  theme(legend.text=element_text(size=9,color="black"))+ # 设置图例字体大小和颜色
  guides(size="none")+
  annotate("text",x=4,y=30,label="气泡大小:学习成绩",size=3.5)+# 添加注释文本
  ggtitle("(b) 学习时长&考试成绩&性别")
grid.arrange(p1,p3,ncol=2) # 按2列组合图形p1和p2

  • 图形解读:图(a)显示学习时长与考试成绩呈显著正相关,趋势线表明每增加1小时学习,成绩约提升3.3分。图(b)揭示性别差异:女性学习时长较长,且高分群体中女性占比更高,反映女性更善于通过增加学习投入获取学业优势。

5 样本相似性可视化

5.1 案例数据解释与展示

  • 本数据集涵盖中国省级行政单位2023年度核心财政收入指标,包含增值税、企业所得税、个人所得税、房产税、契税、行政事业性收费、地方专项收入及非税收入八大核心科目。数据反映各省经济活跃度与财政结构特征:增值税和企业所得税体现工商业规模,个人所得税反映居民收入水平,房产税与契税映射房地产市场热度,行政收费和非税收入显示地方财政多元化程度。通过横向对比可识别区域经济差异——东部沿海省份以增值税/所得税为主力税源,中西部更依赖转移支付和非税收入;纵向分析则揭示各省对土地财政(契税)的依存度变化。该数据是研究地方财力、税源结构及区域经济平衡的关键素材。
data4<-read.csv("财政收入.csv")
colnames(data4)
[1] "地区"               "增值税"             "企业所得税"        
[4] "个人所得税"         "房产税"             "行政事业性收费收入"
[7] "地方专项收入"       "非税收入"           "契税"              
DT::datatable(data4)
df <- data4 |> gather(增值税:契税,key=项目,value=金额) |> 
  mutate(项目=fct_inorder(项目))
datatable(df,rownames = FALSE)

5.2 图形4——地区财政收入星象图

mat<-data4%>%select(-c(地区))%>%as.matrix() # 转换成矩阵
rownames(mat)=data4[,1]  # 设置矩阵行名称
stars(mat,
   full=TRUE,                                # 绘制出满圆
   scale=TRUE,                               # 将数据缩放到[0,1]的范围
   nrow=5,                                   # 5行布局
   len=1,                                    # 设置半径或线段长度的比例
   frame.plot=TRUE,                          # 添加边框
   draw.segments=TRUE,key.loc=c(14,2,5),,   # 绘制圆弧图,并设置位置
   mar=c(0.5,0.1,0.1,0.1),                   # 设置图形边界
   cex=0.6)                                  # 设置标签字体大小

  • 图形解读:该图清晰揭示了2023年中国省级财政的结构性差异:东部沿海地区,如广东、江苏、上海、浙江是财政收入体量较大的地区。在增值税和企业所得税上形成显著高峰,反映其强大的工商业基础;中西部省份则呈现”非税收入主导”特征,如四川、河南的行政事业性收费占比超25%。值得注意的是,房产税与契税呈现”区域分化”——浙江、江苏等地的契税收入仍保持高位,而东北地区房产税成主要支撑。这种可视化有效呈现了经济转型期地方财源的脆弱性与区域不平衡。

6 时间序列可视化

6.1 案例数据解释与展示

  • 特斯拉2010年6月IPO(发行价$17),首年股价剧烈波动($14.98-$35.47),年末收于$23.89(年涨40.7%)。数据包含每日开盘/最高/最低/收盘价及成交量,反映新兴电动车企初期的市场分歧与高波动特性。
data5<-read.csv("Tesla_stock_data.csv")
colnames(data5)
[1] "date"   "close"  "high"   "low"    "open"   "volume"
DT::datatable(data5)
data5$date<- as.Date(data5$date)
df <- data5 |>  select(date:volume) |> 
  mutate(ma5 = rollmean(close, k = 5, fill = NA, align = "right"),
         ma10 = rollmean(close, k = 10, fill = NA, align = "right"),
         ma20 = rollmean(close, k = 20, fill = NA, align = "right"),
         date_index = seq_along(date)
         )
df<- df[df$date >= "2019-01-01", ]
datatable(df)

6.2 图形5——特斯拉K线图

p1 <- df |> ggplot(aes(x = date)) +
  # K线主体(竖线代表最高价-最低价)
  geom_segment(aes(x = date, xend = date, y = low, yend = high), color = "gray50") +
  # K线实体(矩形代表开盘-收盘价)
  geom_rect(aes(
    xmin = date - 0.4, xmax = date + 0.4,
    ymin = pmin(open, close), ymax = pmax(open, close),
    fill = close > open
  )) +
  # 移动平均线
  geom_line(aes(y = ma5, color = "5日"), size = 0.8) +
  geom_line(aes(y = ma10, color = "10日"), size = 0.8) +
  geom_line(aes(y = ma20, color = "20日"), size = 0.8) +
  # 颜色设置
  scale_fill_manual(values = c("TRUE" = "#FF4500", "FALSE" = "#32CD32")) +  # 红涨绿跌
  scale_color_manual(values = c("5日" = "blue", "10日" = "orange", "20日" = "purple")) +
  # 日期轴设置(关键:使用scale_x_date自动处理日期)
  scale_x_date(
    breaks = "3 months",        # 每3个月一个刻度
    labels = scales::date_format("%Y-%m"),  # 显示年月
    expand = c(0, 0)            # 取消x轴两端留白
  ) +
  # 坐标系与主题
  scale_y_continuous(expand = c(0, 0)) +
  theme_minimal(base_size = 12) +
  theme(
    # 移除不必要的边框
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line.x = element_line(color = "gray70"),
    # 调整图例
    legend.position = "top",
    legend.title = element_blank(),
    legend.margin = margin(0, 0, 0, 0),
    legend.box.margin = margin(-5, 0, 5, 0),
    # 调整x轴标签
    axis.text.x = element_text(
      angle = 45, hjust = 1, size = 10, margin = margin(t = 5)
    ),
    # 调整绘图边距
    plot.margin = margin(10, 10, 15, 10)
  ) +
  # 标签设置
  labs(
    title = "特斯拉2019年至今股价走势图",
    y = "股价(美元)",
    fill = "涨跌",
    color = "移动平均线"
  )

# 显示图表
p1

  • 图形解读:

从特斯拉 K 线图来看,其走势波动剧烈。长期呈现上涨趋势,中间夹杂多次大幅涨跌。如 2020 年周 K 线显示,年初从 64 美元暴跌至 3 月的 23 美元,随后又暴涨到 12 月的 167 美元2。2024 - 2025 年期间波动也较大,2024 年 12 月曾创历史新高,之后股价大幅下跌,2025 年 2 月单月跌幅近 3 成3。近期短期均线附近波动明显,MACD 指标显示有空头市场迹象,但 DIF 线有上穿 DEA 线趋势,预示可能有反弹4