You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键细节说明

  1. 有序因子定义:必须手动指定levels顺序,否则R会默认按字母排序(比如Excellent会排在Unsound前面),完全违背业务逻辑。
  2. 排序逻辑:通过提取2016年的状态数据,对每个flooded_flag组内的id排序,生成sorted_pos作为y轴坐标,确保样本按2016年状态有序排列。
  3. 绘图优化:隐藏y轴刻度是因为我们只需要展示排序趋势,不需要具体id;白色边框让每个样本的年度变化更清晰。

内容的提问来源于stack exchange,提问作者tchoup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:50:20