Lasagna图绘制难题:按2016年建筑状态分群排序可视化需求
解决Lasagna图绘制需求(分flooded_flag分组、按2016年建筑状态排序)
核心问题拆解
要实现需求,关键要解决三个核心点:
- 将宽格式的年度状态数据转为长格式(Lasagna图依赖长格式数据结构)
- 确保建筑状态的有序分类属性被正确识别(保证颜色、排序逻辑匹配业务含义)
- 按
flooded_flag分组后,每组内按2016年的建筑状态对观测id排序
完整实现代码
# 加载依赖包 library(tidyverse) # 1. 数据预处理:宽转长 + 整理年份 + 定义有序因子 hcad_long <- hcad %>% # 保留id和flooded_flag,将年度状态列转成长格式 pivot_longer( cols = starts_with("condition_"), names_to = "year", values_to = "condition" ) %>% # 从year列提取纯年份数值 mutate(year = as.integer(str_remove(year, "condition_"))) %>% # 严格按业务顺序定义有序因子,避免默认字母排序错误 mutate(condition = factor(condition, levels = c("Unsound", "Very Poor", "Poor", "Fair", "Good", "Excellent"), ordered = TRUE)) # 2. 生成排序后的样本位置:按flooded_flag分组,每组内按2016年状态排序 sorted_ids <- hcad_long %>% filter(year == 2016) %>% arrange(flooded_flag, condition) %>% mutate(sorted_pos = row_number()) %>% select(id, flooded_flag, sorted_pos) # 3. 合并排序位置到长格式数据 hcad_sorted <- hcad_long %>% left_join(sorted_ids, by = c("id", "flooded_flag")) # 4. 绘制两张Lasagna图 # 图1:受淹样本(flooded_flag=TRUE) ggplot(filter(hcad_sorted, flooded_flag == TRUE), aes(x = year, y = sorted_pos, fill = condition)) + geom_tile(color = "white", size = 0.2) + # 白色边框区分单元格 scale_x_continuous(breaks = 2016:2022) + # 显示所有年份刻度 scale_fill_viridis_d(option = "plasma", direction = -1) + # 颜色映射匹配有序因子 labs(title = "建筑质量年度变化(受淹样本)", x = "年份", y = "样本(按2016年质量排序)", fill = "建筑质量") + theme_minimal() + theme(axis.text.y = element_blank(), # 隐藏y轴刻度,仅展示排序趋势 panel.grid = element_blank()) # 图2:未受淹样本(flooded_flag=FALSE) ggplot(filter(hcad_sorted, flooded_flag == FALSE), aes(x = year, y = sorted_pos, fill = condition)) + geom_tile(color = "white", size = 0.2) + scale_x_continuous(breaks = 2016:2022) + scale_fill_viridis_d(option = "plasma", direction = -1) + labs(title = "建筑质量年度变化(未受淹样本)", x = "年份", y = "样本(按2016年质量排序)", fill = "建筑质量") + theme_minimal() + theme(axis.text.y = element_blank(), panel.grid = element_blank())
关键细节说明
- 有序因子定义:必须手动指定
levels顺序,否则R会默认按字母排序(比如Excellent会排在Unsound前面),完全违背业务逻辑。 - 排序逻辑:通过提取2016年的状态数据,对每个
flooded_flag组内的id排序,生成sorted_pos作为y轴坐标,确保样本按2016年状态有序排列。 - 绘图优化:隐藏y轴刻度是因为我们只需要展示排序趋势,不需要具体id;白色边框让每个样本的年度变化更清晰。
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

