如何在ggplot中基于三类离散指标频次排序图表Y轴
解决ggplot纵向试验受试者Y轴排序问题
核心思路是先对每个受试者计算缺失天数和海洛因使用天数两个指标,基于这两个指标生成排序后的因子变量,再用该变量作为Y轴映射,即可实现需求的排序逻辑。
步骤1:统计受试者指标并生成排序因子
假设你的数据包含subject_id(受试者ID)、day(试验天数)、status(状态:heroin/no_heroin/dropout)三个字段,用dplyr处理数据:
library(dplyr) library(ggplot2) # (如果已有数据可跳过模拟部分) set.seed(123) sim_data <- expand.grid(subject_id = paste0("subj_", 1:20), day = 1:30) %>% mutate(status = sample(c("heroin", "no_heroin", "dropout"), nrow(.), replace = TRUE, prob = c(0.3, 0.5, 0.2))) # 计算每个受试者的缺失天数(退出试验的天数)、海洛因使用天数 subject_stats <- sim_data %>% group_by(subject_id) %>% summarize( dropout_days = sum(status == "dropout"), heroin_days = sum(status == "heroin"), .groups = "drop" ) %>% # 按缺失天数降序、海洛因使用天数降序排序 arrange(desc(dropout_days), desc(heroin_days)) %>% # 将受试者ID转为指定顺序的因子 mutate(subject_order = factor(subject_id, levels = subject_id)) # 合并排序因子到原数据 sim_data_ordered <- sim_data %>% left_join(subject_stats, by = "subject_id")
步骤2:绘制排序后的点图
用生成的subject_order作为Y轴变量,替换原有的subject_id:
ggplot(sim_data_ordered, aes(x = day, y = subject_order, color = status)) + geom_point(size = 2) + # 匹配题目中的颜色规则 scale_color_manual( values = c("heroin" = "red", "no_heroin" = "green", "dropout" = "gray"), labels = c("使用海洛因", "未使用海洛因", "退出试验") ) + labs( x = "试验天数", y = "受试者", color = "状态" ) + theme_bw()
关键说明
- 若你定义的“缺失天数”是指受试者退出试验后未记录的天数,只需调整
dropout_days的计算逻辑(比如用试验总天数减去受试者最后一次有记录的天数),核心流程不变:统计指标→排序→生成因子→绘图。 - ggplot会严格按照因子的
levels顺序渲染Y轴,这是实现自定义排序的核心。
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

