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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:55:15