数据可视化期末报告

Author

221527236刘逸凡

1 报告要求

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

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

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

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

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

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

  • 评分标准:

    • 每章节图形各20分

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

    • 数据独特性强10%

    • 图形个性化强15%

2 类别数据可视化

2.1 案例数据解释与展示

  • 选用data(Titanic)(泰坦尼克号乘客生存数据),绘制旭日图。
library(sunburstR)
data(Titanic)     # 加载Titanic数据集

titanic_df <- as.data.frame(Titanic)     # 将表格数据转换为数据框
titanic_df$path <- paste(
  titanic_df$Class, 
  titanic_df$Sex, 
  titanic_df$Age, 
  titanic_df$Survived, 
  sep = "-"
)     # 创建层级路径列(格式:Class-Sex-Age-Survived)
sunburst_data <- titanic_df[, c("path", "Freq")]
head(sunburst_data)     # 提取路径和频数列
                 path Freq
1   1st-Male-Child-No    0
2   2nd-Male-Child-No    0
3   3rd-Male-Child-No   35
4  Crew-Male-Child-No    0
5 1st-Female-Child-No    0
6 2nd-Female-Child-No    0

2.2 图形1——旭日图

sunburst(
  data = sunburst_data,
  # 颜色配置(可选)
  colors = list(
    range = c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"),
    domain = unique(titanic_df$path)
  ),
  # 其他自定义选项
  width = "100%",
  height = 600
)
Legend
  • 图形解读:船员(Crew)占比最大,乘客中三等舱(3rd)占比显著高于一二等舱,反映当时社会阶层分布。女性(Female)的Yes(幸存)比例明显高于男性,一等舱女性的高幸存率,印证”妇孺优先”的逃生原则。儿童(Child)的占比较小,但幸存比例普遍较高。

3 数据分布可视化

3.1 案例数据解释与展示

  • 选用data(AirPassengers)(1949-1960年国际航空乘客数量),绘制叠加直方图。
library(ggplot2)
ts_decomp <- decompose(AirPassengers)
ts_components <- data.frame(
  Date = time(AirPassengers),
  Observed = as.numeric(AirPassengers),
  Trend = as.numeric(ts_decomp$trend),
  Seasonal = as.numeric(ts_decomp$seasonal),
  Random = as.numeric(ts_decomp$random)
)     # 提取各成分

3.2 图形2——叠加直方图

# 多面板分布可视化
library(gridExtra)
p1 <- ggplot(ts_components, aes(x = Observed)) +
  geom_histogram(fill = "#1f77b4", bins = 12) +
  ggtitle("原始数据分布")

p2 <- ggplot(ts_components, aes(x = Trend)) +
  geom_histogram(fill = "#ff7f0e", bins = 6) +
  ggtitle("趋势成分分布")

p3 <- ggplot(ts_components, aes(x = Seasonal)) +
  geom_histogram(fill = "#2ca02c", bins = 12) +
  ggtitle("季节成分分布")

p4 <- ggplot(na.omit(ts_components), aes(x = Random)) +
  geom_histogram(fill = "#d62728", bins = 12) +
  ggtitle("随机成分分布")

grid.arrange(p1, p2, p3, p4, ncol = 2)

  • 图形解读:双峰结构暗示数据包含不同阶段,1950年代年均增长率约15%;趋势值随时间逐步增大,印证航空业的稳定扩张;振幅稳定,说明季节性模式年复一致;极端值可能对应异常事件;随机成分的正态性说明分解模型合理,趋势与季节成分的分离效果良好。

4 变量关系可视化

4.1 案例数据解释与展示

  • 选用data(airquality)(美国空气质量连续测量数据),绘制六边形分箱散点图。
# 加载数据和质量检查
data(airquality)
summary(airquality)  # 查看是否有NA值
     Ozone           Solar.R           Wind             Temp      
 Min.   :  1.00   Min.   :  7.0   Min.   : 1.700   Min.   :56.00  
 1st Qu.: 18.00   1st Qu.:115.8   1st Qu.: 7.400   1st Qu.:72.00  
 Median : 31.50   Median :205.0   Median : 9.700   Median :79.00  
 Mean   : 42.13   Mean   :185.9   Mean   : 9.958   Mean   :77.88  
 3rd Qu.: 63.25   3rd Qu.:258.8   3rd Qu.:11.500   3rd Qu.:85.00  
 Max.   :168.00   Max.   :334.0   Max.   :20.700   Max.   :97.00  
 NA's   :37       NA's   :7                                       
     Month            Day      
 Min.   :5.000   Min.   : 1.0  
 1st Qu.:6.000   1st Qu.: 8.0  
 Median :7.000   Median :16.0  
 Mean   :6.993   Mean   :15.8  
 3rd Qu.:8.000   3rd Qu.:23.0  
 Max.   :9.000   Max.   :31.0  
                               
# 安装并加载所需包
library(hexbin)
library(ggplot2)

4.2 图形3——六边形分箱散点图

# 计算相关系数(移除NA)
cor_val <- round(cor(airquality$Solar.R, airquality$Ozone, 
                    use = "complete.obs"), 2)

ggplot(na.omit(airquality), aes(x = Solar.R, y = Ozone)) +
  geom_hex(bins = 15, alpha = 0.8) +
  geom_smooth(method = "lm", color = "red", se = FALSE) +  # 添加回归线
  scale_fill_gradientn(colors = c("#f0f9e8", "#bae4bc", "#7bccc4", "#43a2ca", "#0868ac")) +
  annotate("text", x = 50, y = 150, 
           label = paste("相关系数 =", cor_val),
           color = "red", size = 5) +
  labs(title = "太阳辐射与臭氧浓度的密度关系",
       subtitle = "纽约市1973年5-9月每日测量数据",
       caption = "数据来源:纽约州环境保护部") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

  • 图形解读:相关系数0.35表明太阳辐射增强时,臭氧浓度倾向于升高,回归线斜率为正,验证了光化学反应理论(太阳辐射促进臭氧生成)。

5 样本相似性可视化

5.1 案例数据解释与展示

  • 选用data(igraph)(空手道俱乐部社交网络),绘制平行坐标图。
# 安装并加载所需包
library(igraph)
library(igraphdata)

# 正确加载空手道俱乐部数据
data("karate", package = "igraphdata")

# 提取节点特征
node_features <- data.frame(
  ID = V(karate)$name,
  Degree = degree(karate),
  Betweenness = betweenness(karate),
  Closeness = closeness(karate),
  Eigenvector = eigen_centrality(karate)$vector,
  Community = as.factor(membership(cluster_louvain(karate))))  # 社区检测

# 标记关键人物
node_features$Leader <- ifelse(node_features$ID %in% c("Mr Hi", "John A"), 
                            "Leader", "Member")

# 查看前6行数据
head(node_features)
             ID Degree Betweenness   Closeness Eigenvector Community Leader
Mr Hi     Mr Hi     16  250.150000 0.007692308   0.8578794         1 Leader
Actor 2 Actor 2      9   33.800000 0.006060606   0.8287662         1 Member
Actor 3 Actor 3     10   36.650000 0.005952381   0.9903645         1 Member
Actor 4 Actor 4      6    1.333333 0.005347594   0.5453691         1 Member
Actor 5 Actor 5      3    0.500000 0.004629630   0.1529119         2 Member
Actor 6 Actor 6      4   15.500000 0.004608295   0.1851927         2 Member

5.2 图形4——平行坐标图

library(GGally)

ggparcoord(node_features,
           columns = 2:5,  # 选择4个网络中心性指标
           groupColumn = "Community",  # 按社区分组着色
           alphaLines = 0.6,
           scale = "std",  # 标准化方法
           showPoints = TRUE) + 
  labs(title = "空手道俱乐部成员网络特征",
       subtitle = "平行坐标图展示不同社区的中心性指标分布",
       x = "网络指标",
       y = "标准化值") +
  theme_minimal(base_size = 12) +
  scale_color_brewer(palette = "Set1") +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

  • 图形解读:两个社区在所有指标上均存在显著差异(p < 0.05);社交网络中存在不平等权力结构,如少数成员(领导者)占据关键网络位置;Community 1中部分成员的Betweenness与Eigenvector不匹配:高Betweenness但低Eigenvector(局部桥梁节点),低Betweenness但高Eigenvector(核心圈子的非桥梁成员)。

6 时间序列可视化

6.1 案例数据解释与展示

  • 使用”股票数据.csv“,绘制分面折线图。
# 加载必要包
library(ggplot2)
library(dplyr)

# 读取数据
stock_data <- read.csv("股票数据.csv", fileEncoding = "UTF-8")

# 数据清洗:处理可能的异常值
clean_data <- stock_data %>%
  filter(每股收益 > -1, 净资产收益率 > 0) %>%  # 过滤极端异常值
  mutate(股票类型 = factor(股票类型),
         上市板块 = factor(上市板块))

6.2 图形5——分面折线图

ggplot(clean_data, aes(x = 总股本/10000, y = 每股收益, color = 股票类型)) +
  geom_line(stat = "summary", fun = mean, linewidth = 1) +  # 按类型均值连线
  geom_point(alpha = 0.6, size = 2) +  # 显示原始数据点
  facet_wrap(~ 上市板块, ncol = 3) +  # 按上市板块分面
  labs(title = "不同板块股票收益与股本关系",
       x = "总股本(亿股)", 
       y = "每股收益(元)",
       color = "股票类型") +
  theme_minimal(base_size = 12) +
  theme(legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1))

  • 图形解读:这个图形有效揭示了不同市场板块中股本规模与最大收益的差异模式,为股票特征分析提供了直观的视角。