如何在Rtsne图中对样本进行颜色编码

时间:2019-07-06 11:14:20

标签: r ggplot2

我用Rtsne软件包构建了一个tSNE图。下面是代码

library(Rtsne)
library(ggplot2)

dtm<-read.table(args[1],sep=",",header=T,row.names=1)
dtm_t<-t(dtm)

chr_tsne_model<-Rtsne(dtm_t, perplexity=8, theta=0.1, num_threads=30)

d_tsne_1<-as.data.frame(chr_tsne_model$Y)
ggplot(d_tsne_1, aes(x=V1, y=V2)) + geom_point(size=2) + xlab("") + ylab("") + ggtitle("t-SNE") + theme_grey(base_size=21)

我在文件的第一行中有样品名称,而在第一列中有基因名称。我想看到样本间关联的尺寸减小。因此图中的点是样本。

现在,我想查看12个样本(总共25个样本中的样本)如何关联,因此希望它们是红色的,剩下的是黄色和蓝色的。

ggplot(d_tsne_1, aes(x=V1, y=V2, fill=rownames(d_tsne_1))) + geom_point(size=2) + xlab("dim1") + ylab("dim2") + ggtitle("t-SNE") + theme_grey(base_size=21) + scale_fill_manual(values=c('1'="red",'2'="red",'3'="red",'4'="red",'5'="red",'6'="red",'7'="red",'8'="red",'9'="red",'10'="red",'11'="yellow",'12'="yellow",'13'="yellow",'14'="yellow",'15'="yellow",'16'="yellow",'17'="yellow",'18'="yellow",'19'="blue",'20'="blue",'21'="blue",'22'="blue",'23'="blue",'24'="blue"))

我尝试了上述修改,但无济于事。

数据如下:

Genes   Sam_1   Sam_2_PD   Sam_3_PD   Sam_4   Sam_5
ENSG001   1.005   1.325   2.005   3.562   0.004   4.005
ENSG002   1.023   2.355   2.005   3.666   1.004   4.005
.
.
2500 rows, 25 col

Rtsne图中的点代表列(Sam_1,Sam_2_PD等)

PS:我注意到chr_tsne_model$Y丢失了dtm_t中的样本名称,因此它们保留了样本顺序??

请帮助。 预先感谢

1 个答案:

答案 0 :(得分:1)

tl; dr:是的,Rtsne()将名称放在$Y中,但是保留了样本的顺序。

更长的答案:

我没有您的数据,所以我将用虹膜数据集说明一些事情。

假设我做了一些实验:

experiment <- iris[!duplicated(iris[,1:4]),]

我可能想将实际数据与元数据分开(至少在我的工作中很常见)

metadata <- data.frame(sample_id = rownames(experiment),
                       colour = experiment$Species)
data <- as.matrix(experiment[,1:4])

对于ggplot部分,我建议您将颜色编码存储在数据框的一列中,而不要像在scale_colour_manual()中那样手动在colour = experiment$Species中指定每个数据点。

现在,对于tSNE部分,确实删除了样品名称,但保留了顺序。我还建议执行tSNE之前设置种子,以使其更具可重复性,因为tSNE的结果取决于数据的随机初始化。

set.seed(1)
tsne <- Rtsne(data)

在绘制之前,我们在一个数据框中收集所有相关数据:

df <- data.frame(x = tsne$Y[,1],
                 y = tsne$Y[,2],
                 colour = metadata$colour)

然后绘图

ggplot(df, aes(x, y, colour = colour)) +
  geom_point()

enter image description here

现在我个人将删除轴刻度,轴文本和面板网格,因为来自tSNE的数字没有任何意义,它们只是嵌入坐标。此外,您可能会发现将tSNE坐标存储在元数据中很容易,因此以后可以轻松找到它们。

编辑:已经发布了更详细的数据,所以我将展示如何使用提供的变量名

# Attempt to load in data
z <- "Genes   Sam_1   Sam_2_PD   Sam_3_PD   Sam_4   Sam_5
ENSG001   1.005   1.325   2.005   3.562   0.004   4.005
ENSG002   1.023   2.355   2.005   3.666   1.004   4.005"
# Removing column 1 because number of column names doesn't 
# match number of data points
dtm <- read.table(text = z, header = T)[,-1]

接下来,在这种情况下,我们捕获一些感兴趣的元数据:样本是否具有PD后缀?

metadata <- data.frame(
  sample_name = colnames(dtm),
  treatment = paste0(ifelse(grepl("PD", colnames(dtm)), "", "Not "), "PD")
)

我们运行tSNE并格式化data.frame进行绘图

# Had to set perplexity to 1 because only 2 genes to work with
chr_tsne_model <- Rtsne(t(dtm), perplexity=1, theta=0.1, num_threads=30)
df <- chr_tsne_model$Y
colnames(df) <- c("x", "y")
df <- cbind(df, metadata)

然后画图:

ggplot(df, aes(x, y, colour = treatment)) +
  geom_point() +
  scale_colour_manual(values = c("blue","yellow")) +
  # Optional
  theme(axis.ticks = element_blank(),
      axis.text = element_blank(),
      axis.line = element_line(),
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank())

其中两行数据如下所示:

enter image description here