ClusterGVis 对基因表达时间序列聚类和可视化

770129c630c1e2ae2025afc40055cef0.png

没关注?伸出手指点这里

2b3477eaeaad8fa53d1fd6c36f988ee0.png

8bfabfb600883d98efa9c6420dfa9a60.png

1引言

很久之前写过使用 Mfuzzhclust 的方法来对基因进行聚类和可视化。但是许多人觉得 Mfuzz 出图不是特别美观,此外提供的调整参数也很少,相关推文见:

此外我们还会见到 RNA-SEQ 时序分析的 热图表达趋势折线图 及每个亚群的 通路富集结果 可视化在一起,例如:

df3f92e0366017b1451ef61bf3dbcbdd.png

于是整理整理代码,基于 Mfuzzfuzzy c-means 聚类算法和 ComplexHeatmaprow_kmKmeans 聚类对数据进行聚类和可视化,于是产生了 ClusterGVis。这将大大节省科研工作者们写代码和用 Ai 调整美化图片的时间。直接生成发表级图形。最后致敬感谢这两个包作者的贡献!

github 地址:

https://github.com/junjunlab/ClusterGVis

觉得有所帮助可以在 github 上留下你的小心心哦!

b19f9e5d64af49aa6094549d87ac2b15.png

2安装

# install.packages("devtools")
devtools::install_github("junjunlab/ClusterGVis")

3使用

方法选择

输入数据是标准化的 tpm/fpkm/rpkm 表达矩阵,有两种方法进行聚类,分别是 Mfuzzfuzzy c-means 聚类算法和 ComplexHeatmaprow_kmKmeans 聚类算法,用户可根据自己喜好选择。

注意:

聚类是一个随机的过程, 为了保证结果可重复性, clusterData 函数内部设置了随机种子,你可以更改随机种子来改变聚类结果。

...
seed
set a seed for cluster analysis in mfuzz or Heatmap function, default 123.

getClusters 选择聚类个数

getClusters 函数计算均方和, 用户可根据拐点确定最佳聚类个数, 首先加载测试数据:

library(ClusterGVis)

# load data
data(exps)

# check
head(exps,3)
#           zygote  t2.cell  t4.cell  t8.cell   tmorula blastocyst
# Oog4   1.3132282 1.237078 1.325978 1.262073 0.6549312  0.2067114
# Psmd9  1.0917337 1.315989 1.174417 1.064756 0.8685598  0.4845448
# Sephs2 0.9859232 1.201026 1.123076 1.084673 0.8878931  0.7174088

绘图:

# check optimal cluster numbers
getClusters(exp = exps)
4d20ed00783b6529ad90f7663c212cef.png

具体聚类的多少你也可以结合热图结果进行选择最佳的数量。

clusterData 聚类

Mfuzz 聚类,选择 8 个聚类数量:

# using mfuzz for clustering
# mfuzz
cm <- clusterData(exp = exps,
                  cluster.method = "mfuzz",
                  cluster.num = 8)

Kmeans 聚类:

# using complexheatmap row_km for clustering
# kmeans
ck <- clusterData(exp = exps,
                  cluster.method = "kmeans",
                  cluster.num = 8)

聚类返回的结果是一个 list,包含了聚类结果的 长数据格式宽数据格式, 当然你也可以使用该数据自己进行绘图。对于 Mfuzz 聚类的结果则会多一列 membership 的信息。

2f62e6167a4ef852782c9af3136fa700.png
str(ck)
List of 3
 $ wide.res:'data.frame': 3767 obs. of  8 variables:
  ..$ zygote    : num [1:3767] -1.286 -1.205 -0.633 -0.788 -0.619 ...
  ..$ t2.cell   : num [1:3767] 0.594 0.523 -1.209 -1.197 -1.174 ...
  ..$ t4.cell   : num [1:3767] -0.239 -1.082 0.736 0.266 0.125 ...
  ..$ t8.cell   : num [1:3767] -1.011 -0.235 -0.792 -0.544 -0.6 ...
  ..$ tmorula   : num [1:3767] 1.091 1.154 0.66 1.038 0.752 ...
  ..$ blastocyst: num [1:3767] 0.851 0.846 1.238 1.226 1.516 ...
  ..$ gene      : chr [1:3767] "Cdc20" "Yrdc" "Cdca8" "Krt2" ...
  ..$ cluster   : chr [1:3767] "5" "5" "5" "5" ...
 $ long.res:'data.frame': 22602 obs. of  5 variables:
  ..$ cluster     : chr [1:22602] "5" "5" "5" "5" ...
  ..$ gene        : chr [1:22602] "Cdc20" "Yrdc" "Cdca8" "Krt2" ...
  ..$ cell_type   : Factor w/ 6 levels "zygote","t2.cell",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ norm_value  : num [1:22602] -1.286 -1.205 -0.633 -0.788 -0.619 ...
  ..$ cluster_name: chr [1:22602] "cluster 5 (3426)" "cluster 5 (3426)" "cluster 5 (3426)" "cluster 5 (3426)" ...
 $ type    : chr "kmeans"
str(cm)
List of 3
 $ wide.res:'data.frame': 3767 obs. of  9 variables:
  ..$ gene      : chr [1:3767] "-" "1110007A13Rik" "1110054O05Rik" "1500001M20Rik" ...
  ..$ zygote    : num [1:3767] -0.777 -0.711 -0.75 -0.581 -1.084 ...
  ..$ t2.cell   : num [1:3767] -0.656 -0.319 -0.679 -0.655 -0.716 ...
  ..$ t4.cell   : num [1:3767] -0.39 -0.446 -0.478 -0.502 -0.463 ...
  ..$ t8.cell   : num [1:3767] -0.3616 -0.6177 -0.2645 -0.2745 0.0123 ...
  ..$ tmorula   : num [1:3767] 0.2874 0.1466 0.2731 0.0359 0.5938 ...
  ..$ blastocyst: num [1:3767] 1.9 1.95 1.9 1.98 1.66 ...
  ..$ cluster   : num [1:3767] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ membership: num [1:3767] 0.974 0.565 0.992 0.842 0.495 ...
 $ long.res:'data.frame': 22602 obs. of  6 variables:
  ..$ cluster     : num [1:22602] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ gene        : chr [1:22602] "-" "1110007A13Rik" "1110054O05Rik" "1500001M20Rik" ...
  ..$ membership  : num [1:22602] 0.974 0.565 0.992 0.842 0.495 ...
  ..$ cell_type   : Factor w/ 6 levels "zygote","t2.cell",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ norm_value  : num [1:22602] -0.777 -0.711 -0.75 -0.581 -1.084 ...
  ..$ cluster_name: chr [1:22602] "cluster 1 (5754)" "cluster 1 (5754)" "cluster 1 (5754)" "cluster 1 (5754)" ...
 $ type    : chr "mfuzz"

visCluster 绘图

visCluster 函数接收来自 clusterData 的结果,支持生成三种绘图结果,包括 折线图,热图,热图+折线(GO 通路)

绘制折线图:

# plot line only
visCluster(object = cm,
           plot.type = "line")
c98d76ed0c1a1968783986ea9fa4075c.png

修改颜色:

# change color
visCluster(object = cm,
           plot.type = "line",
           ms.col = c("green","orange","red"))
e0d8a0b18335c754543dcdd423203e53.png

去除中位线:

# remove meadian line
visCluster(object = cm,
           plot.type = "line",
           ms.col = c("green","orange","red"),
           add.mline = FALSE)
9a6ac8d3a7e48b0a8047ba87e43b8355.png

kmeans 结果的折线图,因为没有 membership 的信息,所以没有颜色映射:

# plot line only with kmeans method
visCluster(object = ck,
           plot.type = "line")
0c8199232326490d85c79d0e8ccde5b7.png

折线图本质上是 ggplot2 对象,你可以添加其它相关的参数来进行修改细节。


绘制热图:

# plot heatmap only
visCluster(object = ck,
           plot.type = "heatmap")
a4e1fc75b46edd31615a995c4cc76a32.png

添加其它 Heatmap 相关的参数:

# supply other aruguments passed by Heatmap function
visCluster(object = ck,
           plot.type = "heatmap",
           column_names_rot = 45)
f4ae6bac1dd3252e44d8a94fa7d9fc30.png

修改注释条颜色:

# change anno bar color
visCluster(object = ck,
           plot.type = "heatmap",
           column_names_rot = 45,
           ctAnno.col = ggsci::pal_npg()(8))
82506fc40f056c9578a768fb8325478c.png

热图加折线图组合,注意窗口显示的图形注释图形并不能很好的对齐,所以将其保存成 pdf 即可:

# add line annotation
pdf('testHT.pdf',height = 10,width = 6)
visCluster(object = ck,
           plot.type = "both",
           column_names_rot = 45)
dev.off()
fbfe4d8f4d42916694c41a0291a96c91.png

当然你还可以添加箱线图:

# add boxplot
pdf('testbx.pdf',height = 10,width = 6)
visCluster(object = ck,
           plot.type = "both",
           column_names_rot = 45,
           add.box = T)
dev.off()
b71a11900371b39dc3beff943ddfdf79.png

移除折线,修改箱线图颜色:

# remove line and change box fill color
pdf('testbxcol.pdf',height = 10,width = 6)
visCluster(object = ck,
           plot.type = "both",
           column_names_rot = 45,
           add.box = T,
           add.line = F,
           boxcol = ggsci::pal_npg()(8))
dev.off()
c28330371ecac9435a2bbe4ad964d7d9.png

添加 :

# add point
pdf('testbxcolP.pdf',height = 10,width = 6)
visCluster(object = ck,
           plot.type = "both",
           column_names_rot = 45,
           add.box = T,
           add.line = F,
           boxcol = ggsci::pal_npg()(8),
           add.point = T)
dev.off()
92fb6b635ba12ac63c2fb8728d687c88.png

最后你还可以添加富集通路的注释:

# load term info
data("termanno")

# check
head(termanno,4)
#   id                               term
# 1 C1              developmental process
# 2 C1   anatomical structure development
# 3 C1 multicellular organism development
# 4 C2                 system development

# anno with GO terms
pdf('testHTterm.pdf',height = 10,width = 10)
visCluster(object = ck,
           plot.type = "both",
           column_names_rot = 45,
           annoTerm.data = termanno)
dev.off()
b1f0ba8637666431f482823d2bf8bfac.png

注意富集通路的数据必须是亚群 id 和通路名称, 顺序不能反, 此外 亚群 id 和聚类结果名称(C1...) 保持一致。

你可以看到 通路富集的注释连接与折线图的右边似乎并不太恰当, 因为它是与热图右边的注释条相匹配的,此时你可以调整折线注释的位置 line.side = "left":

# change the line annotation side
pdf('testHTtermCmls.pdf',height = 10,width = 10)
visCluster(object = cm,
           plot.type = "both",
           column_names_rot = 45,
           annoTerm.data = termanno,
           line.side = "left")
dev.off()
1ad7a3dbbd26931caa77ec382558908a.png

当然你也可以去除左边的聚类树使其更简洁一些:

# remove tree
pdf('testHTtermCmlsrt.pdf',height = 10,width = 10)
visCluster(object = cm,
           plot.type = "both",
           column_names_rot = 45,
           annoTerm.data = termanno,
           line.side = "left",
           show_row_dend = F)
dev.off()
2af7b6cc9af2b097306fd88d6a6a4768.png

4结尾

有任何疑问和想法,欢迎在 github 上面交流讨论!

a26e9904065e37a11d16c92ad5a27673.png

欢迎加入生信交流群。加我微信我也拉你进 信群聊 老俊俊生信交流群 (微信交流群需收取20元入群费用,一旦交费,拒不退还!(防止骗子和便于管理))

老俊俊微信:

983f47997f69bfb67d75c68a13015b3c.jpeg

知识星球:

f06c14124c315907b6fb1f5d463a2ac8.jpeg

所以今天你学习了吗?

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!

 往期回顾 

AverageHeatmap 对单细胞 marker 基因聚类

听说你想添加亚群数字标签?

dtplyr 使用 dplyr 来运行 data.table

Gene-rank 图标记一下基因名

GseaVis 为你的通路基因添加热图

cellRatioPlot 浅浅的画个细胞比例

GseaVis 多条通路可视化

trackVis 修改样本顺序和分组顺序

GSEA 结果火山图可视化

关于 vroom 的 Benchmarks

◀...

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值