使用swimplot的swimmer_points后Y轴(患者ID)顺序丢失求助
解决swimplot包Y轴患者ID乱序问题
问题本质
你遇到的Y轴顺序混乱,核心原因是swimmer_plot和swimmer_points调用的两个数据集里,patient_id的因子水平顺序不统一。单独用swimmer_plot时,它会默认按数据集里的ID顺序生成因子,但添加点时,如果点数据集的ID是字符型,或者因子顺序和绘图数据集不一致,ggplot(swimplot基于ggplot)就会自动重新排序,导致乱序。
分步解决代码
1. 统一处理原始数据,固定ID顺序
先读入原始CSV,手动把patient_id转为因子并固定顺序(比如按原始数据的出现顺序),再拆分绘图和点的数据集——别用na.omit一刀切删NA,针对性筛选你需要的非NA列就行:
# 读入原始数据(stringsAsFactors=FALSE避免自动转因子) raw_data <- read.csv("你的数据文件.csv", stringsAsFactors = FALSE) # 固定patient_id的因子顺序(按原始数据里的出现顺序) raw_data$patient_id <- factor(raw_data$patient_id, levels = unique(raw_data$patient_id)) # 拆分游泳图数据集:筛选治疗时间非NA的行(替换成你的实际列名) plot_data <- subset(raw_data, !is.na(start_time) & !is.na(end_time)) # 拆分点数据集:筛选事件时间非NA的行(替换成你的实际列名) points_data <- subset(raw_data, !is.na(event_time))
2. 按统一顺序绘图
现在两个数据集的patient_id都是同一顺序的因子,绘图时就不会乱序了:
library(swimplot) library(ggplot2) # 绘制基础游泳图 p <- swimmer_plot(df = plot_data, id = "patient_id", start = "start_time", end = "end_time", name_fill = "treatment") # 替换成你的分组列名 # 添加事件点,确保id列和绘图数据集一致 p + swimmer_points(df_points = points_data, id = "patient_id", time = "event_time", name_shape = "event_type") # 替换成你的事件类型列名
3. 替代方案:用dplyr筛选数据(更直观)
如果你觉得subset用着麻烦,可以用dplyr包的filter函数,语法更易懂:
library(dplyr) plot_data <- raw_data %>% filter(!is.na(start_time), !is.na(end_time)) points_data <- raw_data %>% filter(!is.na(event_time))
验证方法
可以跑一行代码检查两个数据集的ID因子顺序是否完全一致:
all(levels(plot_data$patient_id) == levels(points_data$patient_id))
返回TRUE就说明顺序没问题了。
内容的提问来源于stack exchange,提问作者Benjamin Trewin
相关产品推荐
相关产品推荐

