今天给大家介绍一款进行聚类分析结果可视化的工具clustree。K-mean聚类大家都了解,是可以对优化的K进行选择的算法,那不是最优的k具体情况是否我们也可以进行展示出来,供大家进行更细致的评估?今天这个工具就具有这样的功能,同时在单细胞亚群分析中更是用的风生水起。首先我们看下包的安装:
代码语言:javascript复制install.packages("clustree")
接下来通过实例来给大家看下具体内部实现过程:
代码语言:javascript复制##载入包和数据
library(clustree)
data("nba_clusts")
代码语言:javascript复制##简单树图的绘制
clustree(nba_clusts, prefix = "K")##此处利用了nba_clusts结果中的K开头的几列。
图中,节点代表的是亚群,大小代表亚群中的个体数量;边代表的是随着K增加亚群的分布变化,颜色深浅代表的是具体变化的个体数量、比例。节点的颜色代表的K的值。从图中可以看出来有一个亚群是一直独立的,说明此亚群是比较稳定的。
代码语言:javascript复制###对节点颜色,大小,透明度进行控制
clustree(nba_clusts, prefix = "K", node_colour = "purple", node_size = 10, node_alpha = 0.8)
代码语言:javascript复制###将颜色通过指定列进行变化
clustree(nba_clusts, prefix = "K", node_colour = "ReboundPct",node_colour_aggr = "mean")
代码语言:javascript复制###节点基于SC3稳定系数变化,此系数通过本工具直接进行计算。
clustree(nba_clusts, prefix = "K", node_colour = "sc3_stability")
代码语言:javascript复制##树图分布的改变,默认的是Reingold-Tilford,我们也可以选择Sugiyama使得交叉的空间变小
clustree(nba_clusts, prefix = "K", layout = "sugiyama")
代码语言:javascript复制###上图基础上,使得左边进行去中心化use_core_edges = FALSE
clustree(nba_clusts, prefix = "K", layout = "sugiyama", use_core_edges = FALSE)
代码语言:javascript复制###引入ggplot的配色方案
clustree(nba_clusts, prefix = "K")
scale_color_brewer(palette = "Set1")
scale_edge_color_continuous(low = "blue", high = "red")
代码语言:javascript复制###legend位置的改变
clustree(nba_clusts, prefix = "K")
guides(edge_colour = FALSE, edge_alpha = FALSE)
theme(legend.position = "bottom")
代码语言:javascript复制###每个节点增加标签
clustree(nba_clusts, prefix = "K", node_label = "AssistPct",node_label_aggr = "max")
如果想对分类的个体属性进行归类显示,可以引入自定义函数
代码语言:javascript复制#自定义函数
label_position <- function(labels) {
if (length(unique(labels)) == 1) {
position <- as.character(unique(labels))
} else {
position <- "mixed"
}
return(position)
}
#树图绘制
clustree(nba_clusts, prefix = "K", node_label = "Position",node_label_aggr = "label_position")
从图中我们看出,每个亚群如果是都是同一个位置个体,就会标注具体位置;如果什么位置都有,那就直接标记个mixed。
代码语言:javascript复制##把主成分结果和K树全部进行展示
clustree_overlay(nba_clusts, prefix = "K", x_value = "PC1", y_value = "PC2")
从图中我们看出不仅展示了每个个体的分布同时类的分布也都展示在对应的个体点附近。这样可以明显看出来,主要是分为两类。
那么,我们现在对应的K里的类簇不好看了,那么我们可以对其进行打标签,K*C*表示对应的K,簇。
代码语言:javascript复制###标签设置
clustree_overlay(nba_clusts, prefix = "K", x_value = "PC1", y_value = "PC2",label_nodes = TRUE)
那么,如果想把散点图和树图分开显示,那就是各自展示又相关。
代码语言:javascript复制##slide模式展示
overlay_list <- clustree_overlay(nba_clusts, prefix = "K", x_value = "PC1",y_value = "PC2", plot_sides = TRUE)
##PC1(overlay_list$x_side)或者PC2(overlay_list$y_side)
overlay_list$x_side
那么,我们看下在单细胞领域的应用
代码语言:javascript复制### SingleCellExperiment
library("SingleCellExperiment")
data("sc_example")
names(sc_example)
[1] "counts" "logcounts" "tsne" "sc3_clusters"
[5] "seurat_clusters"
sce <- SingleCellExperiment(assays = list(counts = sc_example$counts,
logcounts = sc_example$logcounts),
colData = sc_example$sc3_clusters,
reducedDims = SimpleList(TSNE = sc_example$tsne))
代码语言:javascript复制head(colData(sce))
代码语言:javascript复制###绘制树图
clustree(sce, prefix = "sc3_", suffix = "_clusters")
代码语言:javascript复制### Seurat objects
library("Seurat")
# Create the Seurat object
seurat <- CreateSeuratObject(counts = sc_example$counts,
meta.data = sc_example$seurat_clusters)
# Add the t-SNE embedding
seurat[['TSNE']] <- CreateDimReducObject(embeddings = sc_example$tsne,
key = "tSNE_")
代码语言:javascript复制###绘制树图,此处是seurat进行聚类分析,所以改用了res.
clustree(seurat, prefix = "res.")
以上只是用于展示的数据,自己的数据具体的展示还要看情况,不过这个展示后可以更好的查看自己的聚类效果怎么样。