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

如何用R/Python对Immunarch分析的CDR3长度数据做标准化?

CDR3长度分布样本量标准化解决方案

一、Immunarch内直接实现标准化

repExplore默认输出的是各CDR3长度的绝对计数,样本量差异会掩盖真实分布比例。你可以手动将计数转换为相对频率后再可视化:

  1. 先提取原始计数数据:
len_data <- repExplore(immdata1$data, .method = "len", .col = "aa")
  1. 按样本分组计算相对频率:
library(dplyr)
len_data_norm <- len_data %>%
  group_by(Sample) %>%
  mutate(Freq = Count / sum(Count)) %>% # 每个长度的计数占该样本总计数的比例
  ungroup()
  1. 用Immunarch的vis函数绘制标准化后的分布:
vis(len_data_norm, .x = "Length", .y = "Freq", .group = "Sample")

二、R中其他替代方法

如果想更灵活,用ggplot2直接处理原始数据也很方便:

library(ggplot2)
# 合并所有样本数据并添加样本标识
combined_data <- dplyr::bind_rows(immdata1$data, .id = "Sample")
# 计算各样本中CDR3长度的相对频率
plot_data <- combined_data %>%
  group_by(Sample, CDR3.aa) %>%
  summarise(Count = n()) %>%
  mutate(Length = nchar(CDR3.aa)) %>%
  group_by(Sample) %>%
  mutate(Freq = Count / sum(Count)) %>%
  ungroup()
# 绘图
ggplot(plot_data, aes(x = Length, y = Freq, color = Sample)) +
  geom_line(stat = "summary", fun = "mean") +
  theme_minimal() +
  labs(x = "CDR3氨基酸长度", y = "相对频率")

三、Python中的实现

用Python的pandas和seaborn也能轻松完成标准化可视化:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 假设immdata_list是存储所有样本数据的DataFrame列表
all_dfs = []
for sample_idx, df in enumerate(immdata_list):
    df["Sample"] = f"Sample_{sample_idx + 1}"
    all_dfs.append(df)
combined_df = pd.concat(all_dfs)

# 计算CDR3长度及相对频率
combined_df["CDR3_Length"] = combined_df["CDR3.aa"].str.len()
freq_df = combined_df.groupby(["Sample", "CDR3_Length"]).size().reset_index(name="Count")
freq_df["Freq"] = freq_df.groupby("Sample")["Count"].transform(lambda x: x / x.sum())

# 绘制标准化分布
plt.figure(figsize=(12, 6))
sns.lineplot(data=freq_df, x="CDR3_Length", y="Freq", hue="Sample")
plt.xlabel("CDR3氨基酸长度")
plt.ylabel("相对频率")
plt.title("标准化后CDR3长度分布")
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:07:04