如何用R的ggplot绘制肿瘤与非肿瘤蛋白组学结果配对对比图
问题描述
我知道本站已有大量类似问题,但还是不知道怎么用到自己的数据上。我需要画一张能关联对应配对组的图,样式类似示例图。我有患者肿瘤(TUMOR)和非肿瘤(NTUMOR)细胞的蛋白质组学质谱分析结果,保存为csv格式,单患者数据结构如下:
| Protein | TUMOR | NTUMOR |
|---|---|---|
| A | 4318100 | 250100 |
| B | 2356000 | 561100 |
| C | 14500 | 0 |
| D | 5468000 | 12500 |
读取数据的代码是:
p610 = read.csv("C:\\Users\\Admin\\Desktop\\Gliwice\\Bazy_danych\\10.23\\patient610.csv", header = TRUE, sep = ",")
(注:原路径中的单反斜杠会被R识别为转义符,必须用双反斜杠或正斜杠,否则会报错)
用ggplot绘图时一直报错,我试过这些代码:
p610 = read.csv("C:\\Users\\Admin\\Desktop\\Gliwice\\Bazy_danych\\10.23\\patient610.csv", header = TRUE, sep = ",") x6=p610$TUMOR ggplot(data = a610, mapping = aes(x=x6, group = x6))
这里明显错误是把数据框名写成了a610,但实际是p610。
后来我把数据整理成了这种结构的csv:
| Patient | TUMOR | Id |
|---|---|---|
| T | 4318100 | 1 |
| T | 2356000 | 2 |
| T | 14500 | 3 |
| T | 5468000 | 4 |
| N | 250100 | 1 |
| N | 561100 | 2 |
| N | 0 | 3 |
| N | 12500 | 4 |
然后运行代码:
ggplot(p610, aes(y = x6)) + geom_point(aes(x = rep(c(-1, 1), each = 8), size = 5) + geom_line(aes(x = rep(c(-1, 1), each = 8), group = Id))
但还是有问题,请问怎么用R的ggplot实现目标配对对比图?
解决方案
方法一:基于原始宽格式数据绘图
原始数据是宽格式(每行对应一个蛋白,两列分别为肿瘤/非肿瘤的数值),首先需要将其转换为ggplot更易处理的长格式(tidy data):
- 加载依赖包:
library(ggplot2) library(tidyr) # 用于数据格式重塑
- 读取并转换数据:
# 读取数据,用正斜杠避免转义问题 p610 <- read.csv("C:/Users/Admin/Desktop/Gliwice/Bazy_danych/10.23/patient610.csv", header = TRUE, sep = ",") # 将宽格式转成长格式 p610_long <- pivot_longer(p610, cols = c(TUMOR, NTUMOR), # 指定要转换的列 names_to = "Sample_Type", # 新列:样本类型(肿瘤/非肿瘤) values_to = "Intensity") # 新列:蛋白强度值
转换后的数据结构如下:
| Protein | Sample_Type | Intensity |
|---|---|---|
| A | TUMOR | 4318100 |
| A | NTUMOR | 250100 |
| B | TUMOR | 2356000 |
| B | NTUMOR | 561100 |
| ... | ... | ... |
- 绘制配对对比图:
ggplot(p610_long, aes(x = Sample_Type, y = Intensity, group = Protein)) + geom_point(size = 3, color = "steelblue") + # 绘制散点 geom_line(color = "gray", linetype = "dashed") + # 用虚线连接同一蛋白的两个样本 labs(title = "肿瘤vs非肿瘤蛋白强度配对对比", x = "样本类型", y = "蛋白强度") + theme_bw()
如果蛋白强度差异过大,可对y轴取对数避免数值挤压:
ggplot(p610_long, aes(x = Sample_Type, y = Intensity, group = Protein)) + geom_point(size = 3, color = "steelblue") + geom_line(color = "gray", linetype = "dashed") + scale_y_log10() + # 对数转换y轴 labs(title = "肿瘤vs非肿瘤蛋白强度配对对比(对数轴)", x = "样本类型", y = "蛋白强度(log10)") + theme_bw()
方法二:基于你整理后的长格式数据绘图
你整理后的格式本身没问题,但代码存在语法错误:geom_point括号未闭合、rep的数量错误、引用了未关联的变量x6,修正后的代码如下:
library(ggplot2) # 读取整理后的长格式数据 p610 <- read.csv("你的整理后数据路径.csv", header = TRUE, sep = ",") ggplot(p610, aes(x = ifelse(Patient == "T", 1, -1), y = TUMOR, group = Id)) + geom_point(size = 3, aes(color = Patient)) + # 按样本类型上色 geom_line(color = "gray") + # 连接配对的点 scale_x_continuous(breaks = c(-1,1), labels = c("NTUMOR", "TUMOR")) + # 替换x轴标签 labs(title = "肿瘤vs非肿瘤蛋白强度配对对比", x = "样本类型", y = "蛋白强度", color = "样本类型") + theme_bw()
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

