如何使用ggplot2基于数据框多列绘制分组geom_bar对比各ID的gene1、gene2计数
解决方案
基于R的ggplot2可以快速实现你要的并排柱状图,完整步骤如下:
1. 数据预处理
首先按样本ID分组,分别统计两种方法的有效检出突变数(排除NA值),再转换为ggplot要求的长表格式:
# 加载所需包 library(dplyr) library(tidyr) library(ggplot2) # 你提供的原始数据赋值给df df <- structure(list(ID = c(4602, 4602, 4602, 5095, 5095, 5095, 5095, 4649, 4649, 4649, 5069, 5069, 5069, 5146, 5132, 5132, 5132, 5132, 5132, 5132, 4297, 4297, 4297, 4297, 4297, 4345, 4345, 4345, 4345, 4345, 4356, 4356, 4356, 4356, 4385, 4385, 4385, 4385, 4385, 4385, 4437, 4437, 4437, 4437, 4437, 4437, 4442, 4442, 4442, 4442, 4442, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4479, 4487, 4487, 4487, 4487, 4487, 4487, 4537, 4537, 4537, 4537, 4537, 4537, 4621, 4621, 4621, 4621, 4621, 4621, 4621, 4624, 4624, 4624, 4624, 4624, 4665, 4736, 4736, 4736, 4736, 4736, 4895, 4895, 4895, 4895, 4895, 4903, 4903, 4903, 4903, 4691, 4691, 4691, 4691, 4261, 4261, 4261, 4261, 4394, 4394, 4394, 4394, 4424, 4424, 4424, 4424, 4943, 4943, 4943, 5073, 5169, 5169), gene1 = c("TET2", "TP53", "TET2", "ASXL1", "DNMT3A", "NPM1", "PTPN11", "TP53", "TP53", "TET2", "DNMT3A", "TET2", "TET2", "negative", "JAK2", "ASXL1", "BRAF", "CBL", "TET2", "TET2", "DNMT3A", "IDH1", "NPM1", "CREBBP", "FLT3", "DNMT3A", "FLT3", "NPM1", "BCOR", "KIT", "DNMT3A", "IDH1", "NRAS", "BCOR", "KRAS", "NPM1", "PTPN11", "ETV6", "PHF6", "TET2", "DNMT3A", "KRAS", "NPM1", "WT1", "TET2", "WT1", "DNMT3A", "FLT3", "NPM1", "NRAS", "WT1", "DNMT3A", "IDH2", "NPM1", "SRSF2", "ATRX", "CUX1", "CUX1", "FLT3", "GNAS", "PHF6", "PIGA", "PIGA", "PRPF40B", "PTPN11", "TET2", "IDH1", "IDH2", "RUNX1", "U2AF1", "TET2", "TP53", "DNMT3A", "IDH2", "ATRX", "GATA2", "STAG2", "TP53", "IDH2", "SRSF2", "ASXL1", "GATA1", "KDM6A", "STAG2", "TP53", "IDH2", "JAK2", "SRSF2", "ASXL1", "RIT1", "KRAS", "NPM1", "NRAS", "NRAS", "BCOR", "MYD88", "FLT3", "NPM1", "NRAS", "TET2", "TET2", "DNMT3A", "IDH1", "NPM1", "CREBBP", "DNMT3A", "IDH1", "IDH2", "NPM1", "FLT3", "FLT3", "GATA2", "SH2B3", "FLT3", "NPM1", "KDM6A", "SMC1A", "IDH2", "SRSF2", "ASXL2", "RUNX1", "IDH2", "JAK2", "NPM1", "JAK2", "SRSF2", "STAG2" ), gene2 = c("TET2", "TP53", "TET2", "ASXL1", "DNMT3A", NA, "PTPN11", "TP53", "TP53", "TET2", "DNMT3A", NA, "TET2", "PTEN", NA, NA, "BRAF", "CBL", "TET2", "TET2", "JAK2", "SRSF2", NA, "DNMT3A", "IDH1", "NPM1", NA, "FLT3", "DNMT3A", "FLT3", "NPM1", NA, NA, "DNMT3A", "IDH1", "NRAS", "BCOR", "KRAS", "NPM1", "PTPN11", "ETV6", "PHF6", "TET2", "DNMT3A", "KRAS", "NPM1", NA, "TET2", NA, "DNMT3A", "FLT3", "NPM1", "NRAS", NA, NA, "IDH2", "NPM1", "SRSF2", NA, "CALR", NA, NA, NA, NA, NA, NA, NA, NA, NA, "IDH1", "IDH2", "RUNX1", "U2AF1", "TET2", NA, "DNMT3A", "IDH2", NA, NA, NA, NA, "IDH2", "SRSF2", "ASXL1", NA, NA, "KMT2D", "TP53", "IDH2", "JAK2", "SRSF2", "ASXL1", NA, "KRAS", "NPM1", "NRAS", "NRAS", NA, NA, "FLT3", "NPM1", "NRAS", "TET2", "TET2", "DNMT3A", "IDH1", "NPM1", "CREBBP", "DNMT3A", "IDH1", "IDH2", "NPM1", "FLT3", "FLT3", NA, NA, "FLT3", "NPM1", NA, "SMC1A", "IDH2", "SRSF2", NA, "RUNX1", "IDH2", "JAK2", "NPM1")), class = "data.frame", row.names = c(NA, -127L)) # 汇总计数并转换格式 count_df <- df %>% group_by(ID) %>% summarise( gene1 = sum(!is.na(gene1)), gene2 = sum(!is.na(gene2)), .groups = "drop" ) %>% pivot_longer(cols = -ID, names_to = "检测方法", values_to = "检出突变数") %>% mutate(ID = as.factor(ID)) # 转因子避免x轴被识别为连续数值
2. 绘制并排柱状图
ggplot(count_df, aes(x = ID, y = 检出突变数, fill = 检测方法)) + # position_dodge控制柱子并排显示 geom_col(position = position_dodge(0.8), width = 0.7) + labs(x = "样本ID", y = "突变检出数", title = "两种检测方法突变检出数对比") + theme_bw() + # x轴标签旋转45度避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1))
效果说明
- 每个样本ID对应两根柱子,左侧为标准方法
gene1的检出计数,右侧为待对比工具gene2的检出计数 - 自动排除了
gene2中的NA值,统计结果和你示例的样本5095检出3和2的结果完全匹配
内容的提问来源于stack exchange,提问作者Alfredo Marchetti
相关产品推荐
相关产品推荐

