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

如何在R中使用循环基于dataframe分组绘制多幅生存时序图?

问题描述

我有如下结构的DataFrame,希望使用for循环为每一组Line、Sex、Dose的组合绘制图表,其中x轴为Time,y轴为Survival。例如,需要分别绘制Line 138、剂量1的雌性个体生存随时间变化图,Line 138、剂量1的雄性个体生存随时间变化图等,请问该如何实现?

TimeSurvivalLineSexDose
280.95138F1
350.65138F1
410.6138F1
420.15138F1
480.05138F1
550138F1
50.95138F1
110.855138F1
280.95138M1
350.65138M1
410.6138M1
420.15138M1
480.05138M1
550138M1
50.95138M1
110.855138M1
280.95120F2
350.65120F2
410.6120F2
420.15120F2
480.05120F2
550120F2
50.95120F2
110.855120F2
280.95120M2
350.65120M2
410.6120M2
420.15120M2
480.05120M2
550120M2
50.95120M2
110.855120M2
解决方案

方法一:Pandas分组 + Matplotlib 手动循环绘制

这是完全符合要求的for循环实现方式:

import pandas as pd
import matplotlib.pyplot as plt

# 假设数据已加载到df中,若从文件读取可使用:
# df = pd.read_csv("你的数据文件路径.csv")

# 按Line、Sex、Dose三个字段分组
grouped = df.groupby(['Line', 'Sex', 'Dose'])

# 遍历每个分组
for (line, sex, dose), subset in grouped:
    # 对Time排序,确保曲线按时间顺序绘制
    subset_sorted = subset.sort_values('Time')
    
    # 创建独立绘图窗口
    plt.figure(figsize=(8, 5))
    # 绘制生存曲线,添加标记点增强可读性
    plt.plot(subset_sorted['Time'], subset_sorted['Survival'], marker='o', linestyle='-', color='#1f77b4')
    
    # 设置图表元素
    plt.title(f"Line {line} | {sex} | Dose {dose}")
    plt.xlabel("Time")
    plt.ylabel("Survival Rate")
    plt.grid(True, alpha=0.3)
    
    # 显示图表,或替换为savefig保存文件
    plt.show()
    # plt.savefig(f"survival_line{line}_sex{sex}_dose{dose}.png", dpi=300, bbox_inches='tight')

关键说明:

  • 分组后遍历每个子数据集,确保每个组合对应独立图表
  • 对Time排序避免数据顺序混乱导致曲线错位
  • 可通过修改marker、linestyle、color参数调整曲线样式
  • 若需要批量保存图表,替换plt.show()为plt.savefig()即可,文件名用分组参数命名方便区分

方法二:Seaborn FacetGrid 自动分面绘制(无需手动循环)

如果不需要严格手动写for循环,Seaborn可以更高效地批量生成所有分组图表,还支持同组对比:

import seaborn as sns
import matplotlib.pyplot as plt

# 先对全量数据按Time排序
df_sorted = df.sort_values('Time')

# 创建分面网格,按Line、Dose分行列,按Sex区分曲线
g = sns.FacetGrid(df_sorted, row='Line', col='Dose', hue='Sex', height=5, aspect=1.2)
# 绘制折线图
g.map(sns.lineplot, 'Time', 'Survival', marker='o')

# 设置标题和标签
g.set_titles(row_template="Line {row_name}", col_template="Dose {col_name}")
g.set_axis_labels("Time", "Survival Rate")
g.add_legend(title="Sex")

plt.show()

优势:

  • 自动按分组生成子图,无需手动循环
  • 支持同一子图内对比不同Sex的生存曲线
  • 代码更简洁,适合快速可视化所有分组情况

内容的提问来源于stack exchange,提问作者K.W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:19:52