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

如何在R/ggplot2中为每位患者绘制配对x-y散点/折线图?

在R/ggplot2中按患者绘制配对散点/折线图

需求说明

希望为每位患者创建一个散点/折线图系列,其中x轴为术后天数(Controll_Days_n),y轴为对应百分比(Controll_Percent_n),同编号的Controll_Percent_n与Controll_Days_n为一组配对数据。样本数据如下:

Patient ID             1        2
Controll_Percent_1     0.000    0.000
Controll_Percent_2     0.035    0.000
Controll_Percent_3     0.035    0.039
Controll_Percent_4     0.053    0.053
Controll_Percent_5     0.088    0.066
Controll_Percent_6     0.088    0.066
Controll_Percent_7     0.105    0.092
Controll_Percent_8     0.123    0.171
Controll_Percent_9     0.158    0.263
Controll_Percent_10    0.158    0.224
Controll_Percent_11    0.197
Controll_Percent_12    0.211
Controll_Percent_13    0.276
Controll_Percent_14     
Controll_Percent_15     
Controll_Percent_16     
Controll_Percent_17     
Controll_Days_1        33        32
Controll_Days_2        378       128
Controll_Days_3        575       502
Controll_Days_4        951       633
Controll_Days_5        1127      800
Controll_Days_6        1324      853
Controll_Days_7        1512      999
Controll_Days_8        1887      1122
Controll_Days_9        2141      1312
Controll_Days_10       2331      1467
Controll_Days_11       1657
Controll_Days_12       2022
Controll_Days_13       2393
Controll_Days_14        
Controll_Days_15        
Controll_Days_16        

解决方案

核心是先将宽格式数据转换为ggplot2所需的长格式,再按患者分组绘图,具体步骤如下:

1. 数据导入与预处理

先构造样本数据框(若数据来自外部文件,可替换为read.csv()等读取函数),然后拆分指标类型、配对x/y数据:

# 构造样本数据框
df <- data.frame(
  Metric = c(
    "Controll_Percent_1", "Controll_Percent_2", "Controll_Percent_3", "Controll_Percent_4",
    "Controll_Percent_5", "Controll_Percent_6", "Controll_Percent_7", "Controll_Percent_8",
    "Controll_Percent_9", "Controll_Percent_10", "Controll_Percent_11", "Controll_Percent_12",
    "Controll_Percent_13", "Controll_Percent_14", "Controll_Percent_15", "Controll_Percent_16",
    "Controll_Percent_17", "Controll_Days_1", "Controll_Days_2", "Controll_Days_3",
    "Controll_Days_4", "Controll_Days_5", "Controll_Days_6", "Controll_Days_7",
    "Controll_Days_8", "Controll_Days_9", "Controll_Days_10", "Controll_Days_11",
    "Controll_Days_12", "Controll_Days_13", "Controll_Days_14", "Controll_Days_15",
    "Controll_Days_16"
  ),
  Patient_1 = c(
    0.000, 0.035, 0.035, 0.053, 0.088, 0.088, 0.105, 0.123, 0.158, 0.158, 0.197, 0.211,
    0.276, NA, NA, NA, NA, 33, 378, 575, 951, 1127, 1324, 1512, 1887, 2141, 2331, 1657,
    2022, 2393, NA, NA, NA
  ),
  Patient_2 = c(
    0.000, 0.000, 0.039, 0.053, 0.066, 0.066, 0.092, 0.171, 0.263, 0.224, NA, NA, NA,
    NA, NA, NA, NA, 32, 128, 502, 633, 800, 853, 999, 1122, 1312, 1467, NA, NA, NA, NA,
    NA, NA
  )
)

# 拆分指标类型和编号
df$Type <- gsub("_\\d+$", "", df$Metric)
df$ID <- as.integer(gsub("^.*_", "", df$Metric))

# 转换为长格式并配对x/y数据
library(tidyr)
long_df <- pivot_longer(df, cols = starts_with("Patient_"), names_to = "Patient", values_to = "Value")
long_df$Patient <- gsub("Patient_", "", long_df$Patient)

final_df <- pivot_wider(long_df, names_from = "Type", values_from = "Value")
final_df <- na.omit(final_df) # 移除缺失值行

2. 使用ggplot2绘制散点+折线图

整理后的数据已按患者、时间点配对好x/y值,直接分组绘图:

library(ggplot2)

ggplot(final_df, aes(x = Controll_Days, y = Controll_Percent, color = Patient)) +
  geom_point(size = 3) + # 添加散点
  geom_line(linewidth = 1) + # 添加折线
  labs(
    title = "术后天数与对应百分比变化",
    x = "术后天数",
    y = "百分比",
    color = "患者ID"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

关键说明

  • 数据转换:通过tidyr的pivot_longer和pivot_wider完成宽长格式转换,将分散的天数和百分比数据配对到同一行,保留患者和时间点标识。
  • 绘图逻辑:用color = Patient指定按患者分组着色,同时叠加散点和折线,清晰展示每个患者的术后变化趋势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:35:22